mitmproxy前端加解密测试

admin 2025年2月7日14:48:32评论6 views字数 6549阅读21分49秒阅读模式

扫码领资料

获网安教程

mitmproxy前端加解密测试

mitmproxy前端加解密测试

本文由掌控安全学院 - Track 投稿

Track安全社区投稿~  

千元稿费!还有保底奖励~(https://bbs.zkaq.cn)

mitmproxy前端加解密测试基础(windows为例)

环境安装

所需的环境:mitmproxy / yakit /phpstudy / python

1,mitmproxy 下载:https://mitmproxy.org/ (windows)

下载后选择目录安装好,然后直接双击运行mitmweb.exe,运行起mitmproxy:

mitmproxy前端加解密测试

浏览器挂上mitmproxy代理后(默认启动后是运行在8080端口,web界面是运行在8081端口),然后访问:http://mitm.it/ ,下载mitmproxy证书

mitmproxy前端加解密测试

下载好证书后,直接双击证书安装证书:

mitmproxy前端加解密测试

密码直接留空,下一步:

mitmproxy前端加解密测试

将证书存储在“受信任的根证书颁发机构”,然后直到安装完成即可。

mitmproxy前端加解密测试

接着运行pip install mitmproxy给python安装mitmproxy模块就可以了。

测试基础

这里直接借用了先知大牛的文章,跟着做一遍复现即可,主要体会其中过程,理解上下游代理是如何运转以及其中的原理。

上下游代理

一般上下游代理是数据传输从服务端到客户端而言,也就是说服务端为 上游,客户端为 下游,而 burp/yakit 则是位于服务端和客户端之间的代理,因此burp的流量走向上,上边就是上游代理,下边,就是下游代理。

上游代理:服务器-> 上游代理 -> burp/yakit -> 客户端

下游代理:服务器 -> burp/yakit -> 下游代理 -> 客户端

我们今天要实现的效果:服务器 -> 上游代理 -> burp/yakit -> 下游代理 -> 客户端

为啥要上 上下游代理 ,因为如果说 服务器和客户端 两端传输的数据都是加密的话,一般客户端这边是JS代码解密,而我们直接使用burp/yakit 抓包的话,看到的都是加密数据,无从下手,因此需要上下游代理,实现传输中的加解密,实现burp/yakit上抓到的数据是解密后的结果,而传输到服务器和客户端又正好是加密后的结果,保证正常“走数据包”的同时又能对数据包进行测试分析。

前后端测试环境搭建

搭建的话,就用phpstudy起一个web网站就行了,这个是最基本的了,在此不赘述。

前后端代码文件:index.html

  1. <!DOCTYPE html>

  2. <htmllang="en">

  3. <head>

  4. <metacharset="UTF-8">

  5. <metaname="viewport"content="width=device-width, initial-scale=1.0">

  6. <title>Base64编码示例</title>

  7. </head>

  8. <body>

  9. <formid="myForm">

  10. <labelfor="userInput">输入文本:</label>

  11. <inputtype="text"id="userInput"name="userInput"required>

  12. <buttontype="button"onclick="encodeAndSend()">提交</button>

  13. </form>

  14. <!-- 添加用于显示服务端返回的数据的元素 -->

  15. <divid="responseDataContainer"></div>

  16. <script>

  17. function encodeAndSend(){

  18. var userInput = document.getElementById("userInput").value;

  19. var encodedData = btoa(userInput);

  20. var jsonData ={

  21. encodedData: encodedData

  22. };

  23. fetch('d.php',{

  24. method:'POST',

  25. headers:{

  26. 'Content-Type':'application/json'

  27. },

  28. body: JSON.stringify(jsonData)

  29. })

  30. .then(response => response.text())// 修改部分:使用 response.text() 获取字符串

  31. .then(data =>{

  32. // 修改部分:将服务端返回的字符串显示在页面上

  33. var responseDataContainer = document.getElementById("responseDataContainer");

  34. responseDataContainer.innerHTML ='服务端返回的数据:'+ data;

  35. })

  36. .catch(error =>{

  37. console.error('Error:', error);

  38. });

  39. }

  40. </script>

  41. </body>

  42. </html>

后端代码文件:d.php

  1. <?php

  2. header('Content-Type: application/json');

  3. // 获取 POST 参数

  4. $postData = json_decode(file_get_contents("php://input"),true);

  5. // 检查是否接收到有效数据

  6. if(isset($postData['encodedData'])){

  7. // 获取 Base64 编码的数据

  8. $encodedData = $postData['encodedData'];

  9. // 判断是否以等号("=")结尾,以此判断传过来的数据是否做了base64加密

  10. if(substr($encodedData,-1)==='='){

  11. // 如果以等号结尾,解码并再次进行加密传递给客户端

  12. $decodedData = base64_decode($encodedData);

  13. $decodedData = base64_encode($decodedData);

  14. }else{

  15. // 如果不是 Base64 编码,直接对原始数据进行 Base64 编码

  16. $decodedData = base64_encode($encodedData);

  17. }

  18. // 返回继续加密后的数据

  19. $response = array('reencodedData'=> $decodedData);

  20. echo json_encode($response);

  21. }else{

  22. // 返回错误信息

  23. $errorResponse = array('error'=>'Invalid data received');

  24. echo json_encode($errorResponse);

  25. }

  26. ?>

访问后,加密aaadsdsada1 yakit抓包效果

mitmproxy前端加解密测试

代码简介:输入数据,如果数据不是以 = 结尾,则加密一次base64后,再加密一次base64后返回加密数据,如果以 = 号结尾,则直接返回base64结果(这里应该问题不大,只要找一串加密后带等于号的字符串测试即可)。

上下游代理测试

实际上在调试的时候,感觉容易搞混乱,后面想清楚了,我们要沿着一个思路主线去进行:那就是,将原本yakit上抓的 请求/响应 中的加密数据,最终呈现效果为 请求/响应 中的数据被解密以明文的方式展示出来!

处理请求和响应基本的python代码框架如下:

  1. from mitmproxy import flowfilter,ctx

  2. from mitmproxy.http importHTTPFlow

  3. from mitmproxy import flowfilter

  4. from mitmproxy.http importHTTPFlow

  5. classMimit():

  6. def request(self,flow):

  7. def response(self,flow):

  8. addons =[Mimit(),]

下游代理调试

downstrem.py

  1. from mitmproxy import flowfilter,ctx

  2. from mitmproxy.http importHTTPFlow

  3. from mitmproxy import flowfilter

  4. from mitmproxy.http importHTTPFlow

  5. import base64

  6. import json

  7. classMimit():

  8. def request(self,flow):

  9. if flow.request.host=="192.168.10.32":

  10. req = json.loads(flow.request.get_text())

  11. ctx.log.info("浏览器请求数据 => "+req['encodedData'])

  12. data = base64.b64decode(str(req['encodedData']).encode()).decode()

  13. req['encodedData']= data

  14. ctx.log.info("下游代理解密请求数据 => "+ req['encodedData'])

  15. flow.request.set_text((json.dumps(req)))

  16. def response(self,flow):

  17. if flow.request.host=="192.168.10.32":

  18. rep = json.loads(flow.response.get_text())

  19. ctx.log.info("响应数据 => "+rep['reencodedData'])

  20. data = base64.b64encode(str(rep['reencodedData']).encode()).decode()

  21. rep['reencodedData']= data

  22. ctx.log.info("下游代理加密响应数据 => "+ rep['reencodedData'])

  23. flow.response.set_text(json.dumps(rep))

  24. addons =[Mimit(),]

流量走向:服务器 -> burp/yakit -> 下游代理(mitmproxy - downstream.py) -> 客户端

启动mitmproxy,打开cmd窗口,输入命令:将mitmproxy设置为yakit的上游代理,8083是我yakit的代理端口

  1. mitmdump -p 7070-s downstream.py --mode upstream:http://127.0.0.1:8083 --ssl-insecure

浏览器挂7070端口mitmproxy代理,将流量转发到mitmproxy上面。

此时,因为只设置了下游代理,下游代理会对客户端给到的加密数据进行解密,然后再丢给yakit,因此yakit中抓的包中,请求包中的数据是明文的,然后yakit 将带有明文的请求包丢给服务器,因为这时还没有设置上游代理,因此服务端拿到的数据是:aaadsdsada1,然后对 aaadsdsada1 进行base64加密,返回结果YWFhZHNkc2FkYTE=丢给yakit,因此yakit中响应包中的内容是密文YWFhZHNkc2FkYTE=,yakit再将密文丢给mimtproxy,因为如果按正常逻辑来说,客户端也要接收到的是密文嘛,因此在下游代理脚本里面要写一个加密逻辑,将数据加密后返回,又因为从yakit那里接收到的是经过一次编码的密文,加密逻辑又会对密文再加密base64编码一次,因此客户端最终得到的结果就是 WVdGaFpITmtjMkZrWVRFPQ==。

mitmproxy前端加解密测试

mitmproxy前端加解密测试

mitmproxy前端加解密测试

mitmproxy前端加解密测试

上游代理调试(burp演示)

下面把yakit换成burp,没用习惯,不知道在哪设置yakit的上游代理… …

upstream.py

  1. from mitmproxy import flowfilter,ctx

  2. from mitmproxy.http importHTTPFlow

  3. from mitmproxy import flowfilter

  4. from mitmproxy.http importHTTPFlow

  5. import base64

  6. import json

  7. classMimit():

  8. def request(self,flow):

  9. if flow.request.host=="192.168.10.32":

  10. req = json.loads(flow.request.get_text())

  11. ctx.log.info("浏览器请求数据 => "+req['encodedData'])

  12. data = base64.b64encode(str(req['encodedData']).encode()).decode()

  13. req['encodedData']= data

  14. ctx.log.info("上游代理加密请求数据 => "+ req['encodedData'])

  15. flow.request.set_text((json.dumps(req)))

  16. def response(self,flow):

  17. if flow.request.host=="192.168.10.32":

  18. rep = json.loads(flow.response.get_text())

  19. ctx.log.info("响应数据 => "+rep['reencodedData'])

  20. data = base64.b64decode(str(rep['reencodedData']).encode()).decode()

  21. rep['reencodedData']= data

  22. ctx.log.info("上游代理解密响应数据 => "+ rep['reencodedData'])

  23. flow.response.set_text(json.dumps(rep))

  24. addons =[Mimit(),]

流量走向:服务器 -> 上游代理(mitmproxy - upstream.py) ->burp/yakit -> 客户端

burp设置上游代理

mitmproxy前端加解密测试

mitmproxy命令:

  1. mitmdump -p 9091-s upstream.py --ssl-insecure

mitmproxy前端加解密测试

mitmproxy前端加解密测试

mitmproxy前端加解密测试

这个的过程直接看图即可,文字描述就有点多了:

mitmproxy前端加解密测试

上下游代理联动

流量走向:服务器 -> mitmproxy上游代理(upstream.py) -> burp/yakit -> mitmproxy下游代理(downstream.py) -> 客户端

mitmproxy前端加解密测试

mitmproxy前端加解密测试

  1. 上游代理:mitmdump -p 9091-s upstream.py --ssl-insecure

  2. 下游代理:mitmdump -p 7070-s downstream.py --mode upstream:http://127.0.0.1:8083 --ssl-insecure

图解如下:

mitmproxy前端加解密测试

上下游代理debug

上游脚本

  1. import sys

  2. import os

  3. from mitmproxy.tools.main import mitmdump

  4. sys.path.append(os.path.dirname(os.path.abspath(__file__)))

  5. print(os.path.dirname(os.path.abspath(__file__)))

  6. # 使用 mitmdump 启动并指定端口

  7. mitmdump(['-s','enc.py','-p', str(9091)])

下游脚本

  1. import sys

  2. import os

  3. from mitmproxy.tools.main import mitmdump

  4. sys.path.append(os.path.dirname(os.path.abspath(__file__)))

  5. print(os.path.dirname(os.path.abspath(__file__)))

  6. # 启动 mitmdump

  7. mitmdump(['-s','dec.py','-p', str(7071),'--mode',"upstream:http://127.0.0.1:8080"])

这里就不作演示了,用到的时候调试即可。

参考资料

JS加解密之mitmproxy联动Burp全自动加解密数据包

https://xz.aliyun.com/news/12664

https://docs.mitmproxy.org/stable/#features

https://learn.microsoft.com/en-us/windows/wsl/install(可安装可不安装,只是改善界面显示用的)

申明:本公众号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,

所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法.

mitmproxy前端加解密测试

原文始发于微信公众号(掌控安全EDU):mitmproxy前端加解密测试

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年2月7日14:48:32
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   mitmproxy前端加解密测试https://cn-sec.com/archives/3709407.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息