安全矩阵

 找回密码
 立即注册
搜索
查看: 939|回复: 0

AES+SM4 两层加密算法加密传输场景下的通用渗透测试思路

[复制链接]

215

主题

215

帖子

701

积分

高级会员

Rank: 4

积分
701
发表于 2023-12-1 22:46:45 | 显示全部楼层 |阅读模式
AES+SM4 两层加密算法加密传输场景下的通用渗透测试思路

文章转载自:Zgao's blog


最近的一个渗透项目中,网站的流量用到了AES+SM4 两层加密算法加密传输。遇到传输加密的网站,通常是没办法上漏扫的。奈何手工测试效率太低,故研究了加密传输场景下渗透测试通用解决思路。

如何加解密传输流量?
这里通常是有两种方式来实现。

用Python重新实现加解密算法
如果网站的加密算法是标准的加密算法如AES等,可以直接用Python的pycrypto模块原生实现。遇到相对简单的加密算法也可以把js中的加解密代码抠出来,用Python的execJs执行得到结果。

例如用Python手动实现网站的加解密代码如下:




这种方式只能实现简单的加密算法,而且需要写代码处理相对麻烦。

JSRPC 转发加解密函数
如果遇到复杂的加解密算法,比如某些在标准算法上魔改的算法,根本没法从JS中扣出关键代码的场景,就非常适合jsrpc的方式直接调用浏览器中的加解密函数。

  1. https://github.com/jxhczhl/JsRpc
复制代码


既然网站的传输内容是加密的,所以就需要在流量进入被动扫描器之前把流量先进行解密。

Mitmproxy 对流量进行加解密
mitmproxy 就是用于 MITM 的 proxy,MITM 即中间人攻击(Man-in-the-middle attack)。用于中间人攻击的代理首先会向正常的代理一样转发请求,还能适时的查、记录其截获的数据,或篡改数据,引发服务端或客户端特定的行为。不同于 fiddler 或 wireshark 等抓包工具,mitmproxy 不仅可以截获请求帮助开发者查看、分析,更可以通过自定义脚本进行二次开发。

上面提到可以用Python重新实现加解密算法,但是在流量进入到被动扫描器之前,需要有一个中间人来做加解密操作,而mitmproxy就充当了这个角色。可以把Python实现加解密的代码放在mitmproxy中运行,在系统中安装信任mitmproxy的证书,让mitmproxy解密https的流量后再进行二次解密。

mitmproxy命令行
第一个mitmproxy的命令行需要设置上游代理为xray监听的ip和端口。

mitmdump -s code.py -p 8010 --set block_global=false --mode upstream:http://xray-ip:port --ssl-insecure
第二个mitmproxy的命令行是直接转发给目标网站的。

mitmdump -s code.py -p 8020 --set block_global=false --ssl-insecure
mitmproxy 代码模版
由于流程中涉及到4次mitmproxy的加解密,所以要开启两个mitmproxy监听端口来转发流量。

第一次流量加解密代码模板
  1. <p>from mitmproxy import http</p><p>
  2. </p><p># 加解密函数可以用Python重新实现,也可以用jsrpc直接转发加解密函数接口</p><p>
  3. </p><p># 解密函数</p><p>def myEncrypt(data):</p><p>    pass</p><p>
  4. </p><p># 解密函数</p><p>def myDecrypt(data):</p><p>    pass</p><p>
  5. </p><p># 对 浏览器 请求内容进行解密,转发给 扫描器</p><p>def request(flow: http.HTTPFlow) -> None:</p><p>    if flow.request.pretty_host != "target.com":</p><p>        return          # 如果不是目标域名,直接转发不做任何操作</p><p>    try:</p><p>        param = flow.request.content.decode()</p><p>        decryptData = myDecrypt(param)</p><p>
  6. </p><p>        print("第一次请求解密:\n"+decryptData)</p><p>
  7. </p><p>        # 将解密后的报文替换加密报文</p><p>        flow.request.content = decryptData</p><p>
  8. </p><p>    except Exception as e:</p><p>        print(f"报文解密失败: {e}")</p><p>
  9. </p><p># 对 扫描器 响应内容进行加密,转发给 浏览器</p><p>def response(flow: http.HTTPFlow) -> None:</p><p>    if flow.request.pretty_host != "target.com":</p><p>        return          # 如果不是目标域名,直接转发不做任何操作</p><p>    try:</p><p>        param = flow.response.content.decode()  </p><p>        encryptData = myEncrypt(param)</p><p>
  10. </p><p>        print("第一次响应加密:\n" + encryptData)</p><p>
  11. </p><p>        # 将明文的报文加密传输</p><p>        flow.response.content = encryptData</p><p>
  12. </p><p>    except Exception as e:</p><p>        print(f"报文加密失败: {e}")</p>
复制代码

第二次流量加解密代码模版
  1. <p>from mitmproxy import http</p><p>
  2. </p><p># 加解密函数可以用Python重新实现,也可以用jsrpc直接转发加解密函数接口</p><p>
  3. </p><p># 解密函数</p><p>def myEncrypt(data):</p><p>    pass</p><p>
  4. </p><p># 解密函数</p><p>def myDecrypt(data):</p><p>    pass</p><p>
  5. </p><p># 对 扫描器 请求内容进行加密,转发给 网站</p><p>def request(flow: http.HTTPFlow) -> None:</p><p>    if flow.request.pretty_host != "target.com":</p><p>        return          # 如果不是目标域名,直接转发不做任何操作</p><p>    try:</p><p>        param = flow.request.content.decode()  </p><p>        encryptData = myEncrypt(param)</p><p>
  6. </p><p>        print("第二次请求加密:\n" + encryptData)</p><p>
  7. </p><p>        # 将明文报文替换为加密报文</p><p>        flow.request.content = encryptData</p><p>
  8. </p><p>    except Exception as e:</p><p>        print(f"报文加密失败: {e}")</p><p># 对 网站 响应内容进行解密,转发给 扫描器</p><p>def response(flow: http.HTTPFlow) -> None:</p><p>    if flow.response.pretty_host != "target.com":</p><p>        return          # 如果不是目标域名,直接转发不做任何操作</p><p>    try:</p><p>        param = flow.response.content.decode()</p><p>        decryptData = myDecrypt(param)</p><p>
  9. </p><p>        print("第二次请求解密:\n"+decryptData)</p><p>
  10. </p><p>        # 将加密报文替换为明文报文</p><p>        flow.response.content = decryptData</p><p>
  11. </p><p>    except Exception as e:</p><p>        print(f"报文解密失败: {e}")</p>
复制代码

xray的配置修改
因为在xray的前后都有mitmproxy对流量进行加解密,所以xray只需要配置上游代理即可。但是需要修改两处配置,http和upstream_proxy都要改为mitmproxy的ip端口。





实战测试


虽然加密传输场景下的渗透测试流程上比较复杂,但是流量本身自带加密,waf也拦截不了,也省了些麻烦事。

实战中使用上面我提供的mitmproxy模版并替换加解密函数,就可以对加密传输的网站直接上漏扫了,收工!

参考文章

渗透测试高级技巧:分析验签与前端加密(一)
https://mp.weixin.qq.com/s/ni3sVp0Gh-CwyMPuwk__Cw
渗透测试高级技巧(二):对抗前端动态密钥与非对称加密防护
https://mp.weixin.qq.com/s/gMbbEV62XR5_QCACQwZnOw


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-27 22:33 , Processed in 0.013249 second(s), 19 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

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