51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1810|回复: 0
打印 上一主题 下一主题

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

[复制链接]
  • TA的每日心情
    无聊
    前天 09:05
  • 签到天数: 1050 天

    连续签到: 1 天

    [LV.10]测试总司令

    跳转到指定楼层
    1#
    发表于 2021-10-18 15:47:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
     在做渗透测试的时候,经常会遇到报文加密加签的情况,即使通过了其他技术手段破解了加解密机制,  进行报文的篡改还是很不方便。
      此时,可以引入一个开源的代理工具——Mitmproxy。

      Mitmproxy简介
      Mitmproxy是一个开源的HTTPS代理工具,顾名思义,Mitm是一个用于中间人(Man-in-the-middle) 攻击的代理工具。
      如下图所示,Mitmproxy像正常的代理服务器一样工作于客户端和服务端之间,通过   转发通信报文维持通信,但同时Mitmproxy也可以查询,记录甚至篡改其转发的报文,从而引发服务端   或客户端的特定行为,来达到使用者的特定目的。

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

      Mitmproxy脚本编写
      Mitm的脚本结构通常如下所示:
    1. from mitmproxy import http, ctx
    2. class MyProxy1: def foo1:
    3. pass

    4. def foo2:
    5. pass

    6. class MyProxy2:
    7. ...

    8. addons = [
    9. MyProxy1(),
    10. MyProxy2(),
    11. ...
    12. ]
    复制代码
    开启代理后并加载脚本后,Mitm将拦截的报文并根据编写的脚本执行特定的行为。

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

      flow.request.headers
      获取所有头信息,包含Host、User-Agent、Content-type等字段。
    1. # 获取headers内容
    2. cookie = flow.request.headers['Cookie']

    3. # 修改headers内容
    4. flow.request.headers['Content-Type'] = 'application/json'
    复制代码
     flow.request.url
      完整的请求地址,包含域名及请求参数,但是不包含放在body里面的请求参数。
    1. #截取指定url
    2. 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里面,那么可通过此方法获取,返回字典类型。
    1. body = flow.request.get_text()
    2. body_json = json.loads(flow.request.get_text())
    复制代码
     flow.request.set_text()
      修改请求中body内容,不需转码。
    1. POST /login HTTP/1.1
    2. HOST: www.xxx.com
    3. ...
    复制代码
    1. {"account":"abc", "passwd":"123456"}
    2. newBody = {'account':'abcd', 'passwd':'123456'} flow.set_text(str(newBody))
    复制代码
    flow.request.query
      返回MultiDictView类型的数据,url直接带的键值参数。
    1. # 请求www.xxx.com/login?account=abc&passwd=123456
    2. 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直接带的键值参数。
    1. POST /login HTTP/1.1 HOST: www.xxx.com
    2. ...
    3. content-type:application/x-www-form-urlencoded
    4. ...
    复制代码
    1. account=abc&passwd=123456
    2. 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= 进行爆破和注入测试。









    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有帐号?(注-册)加入51Testing

    x
    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-23 00:30 , Processed in 0.061399 second(s), 25 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表