论报文加密加签场景下如何高效的进行渗透测试
字数 1633 2025-08-24 16:48:15

基于Burp Montoya API的报文加密加签场景渗透测试指南

1. 背景与问题概述

在现代Web应用安全测试中,越来越多的系统采用HTTP报文加密/加签传输机制,这给渗透测试工作带来了新的挑战:

  • 无法直接查看和修改明文报文
  • 传统解决方案(如burpy插件、mitmproxy代理)存在使用不便的问题
  • 不同语言实现的加密算法可能存在细微差异,调试耗时

2. 解决方案架构

2.1 整体思路

利用Burp的Montoya API,在请求/响应的四个关键处理节点插入自定义处理逻辑:

  1. 请求从客户端到达Burp时:解密请求
  2. 请求从Burp发送到服务器时:加密请求
  3. 响应从服务器到达Burp时:解密响应
  4. 响应从Burp返回客户端时:加密响应

2.2 技术实现框架

项目名称:Galaxy
GitHub地址:https://github.com/outlaws-bai/Galaxy

3. 核心功能实现

3.1 请求过滤机制

采用JavaScript表达式过滤需要处理的请求,默认表达式:

!request.isStaticExtension() && request.host == '192.168.1.4'

特点:

  • 支持复杂逻辑判断
  • 可自定义修改以适应不同场景
  • 返回boolean值决定是否处理当前请求

3.2 四种实现方式

实现方式 优点 缺点 适用场景
Python 语法简洁,易上手 JVM中运行可能有兼容性问题 快速实现简单逻辑
JavaScript 前端开发者友好 同Python 简单加解密场景
Java 直接使用Java加密库,无兼容问题 需要Java知识 复杂加密逻辑
gRPC 跨语言能力强 性能较低,学习成本高 特殊语言需求

3.3 关键处理节点

  1. hookRequestToBurp:客户端→Burp时解密
  2. hookRequestToServer:Burp→服务器时加密
  3. hookResponseToBurp:服务器→Burp时解密
  4. hookResponseToClient:Burp→客户端时加密

4. 动态密钥处理方案

4.1 典型场景

  1. 客户端首次请求获取密钥/IV
  2. 后续通信使用该密钥加密
  3. 密钥可能定期更换

4.2 实现示例

Java实现代码框架:

import org.m2sec.core.utils.*;
import org.m2sec.core.models.*;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;

public class Test {
    private Logger log;
    private static final String ALGORITHM = "AES/CBC/PKCS5Padding";
    private byte[] secret;
    private byte[] iv;
    private static final Map<String, Object> paramMap = new HashMap<>();
    private static final String jsonKey = "data";
    private final ThreadLocal<Boolean> flag = ThreadLocal.withInitial(() -> false);
    
    // 各hook方法实现...
}

4.3 关键处理逻辑

  1. 密钥获取识别
if (request.getPath().endsWith("/api/getSecret")) {
    flag.set(true);
}
  1. 密钥更新处理
Map<?,?> bodyMap = JsonUtil.jsonStrToMap(new String(response.getContent()));
String secret1 = ((String)bodyMap.get("key"));
String iv1 = ((String)bodyMap.get("iv"));
secret = secret1.getBytes();
iv = iv1.getBytes();
paramMap.put("iv", iv);
  1. 加解密处理
public byte[] decrypt(byte[] content) {
    return CryptoUtil.aesDecrypt(ALGORITHM, content, secret, paramMap);
}

public byte[] encrypt(byte[] content) {
    return CryptoUtil.aesEncrypt(ALGORITHM, content, secret, paramMap);
}

5. 实际应用示例

5.1 测试环境搭建

  1. 服务端(Python):
# pip install fastapi pycryptodome
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from fastapi import FastAPI
import uvicorn

app = FastAPI()

@app.get("/api/getSecret")
async def get_secret():
    key = generate_string(32)  # 生成随机密钥
    iv = generate_string(16)   # 生成随机IV
    return {"key": key, "iv": iv}

@app.post("/api/login")
async def login(request: LoginRequest):
    # 解密请求数据
    login_data = decrypt(request.data, key, iv)
    # 业务处理...
    # 加密响应数据
    encrypted_response = encrypt(response_data, key, iv)
    return {"data": encrypted_response}
  1. 客户端(HTML/JavaScript):
<script src="https://cdn.jsdelivr.net/npm/crypto-js@4.1.1/crypto-js.js"></script>
<script>
let secretKey = '';
let iv = '';

async function getSecret() {
    const response = await fetch('/api/getSecret');
    const data = await response.json();
    secretKey = data.key;
    iv = data.iv;
}

function encrypt(data, key, iv) {
    return CryptoJS.AES.encrypt(JSON.stringify(data), 
           CryptoJS.enc.Utf8.parse(key), 
           {iv: CryptoJS.enc.Utf8.parse(iv), mode: CryptoJS.mode.CBC}).toString();
}

async function login() {
    const encryptedData = encrypt(formData, secretKey, iv);
    const response = await fetch('/api/login', {
        method: 'POST',
        body: JSON.stringify({data: encryptedData})
    });
    // 处理加密响应...
}
</script>

5.2 Galaxy配置步骤

  1. 安装Galaxy插件
  2. 配置Java处理脚本(如4.2节示例)
  3. 启动Burp代理
  4. 访问测试页面,观察自动加解密效果

6. 支持的加密算法

目前已实现支持:

  • AES-CBC
  • AES-ECB
  • AES-GCM
  • RSA
  • SM2

扩展建议:

  1. CryptoUtil类中添加新算法实现
  2. 更新示例脚本提供使用参考

7. 最佳实践建议

  1. 表达式优化

    • 精确匹配目标系统
    • 排除静态资源请求
    • 示例:request.host.endsWith('target.com') && request.path.startsWith('/api/')
  2. 异常处理

    • 记录加解密失败日志
    • 提供fallback机制保证正常流量通过
  3. 性能考虑

    • 对于高并发场景优先选择Java实现
    • gRPC实现需注意网络延迟
  4. 调试技巧

    • 使用log.info()输出关键变量
    • 在Repeater模块中单独测试加解密逻辑

8. 总结

Galaxy插件的核心优势:

  1. 高效集成:无需额外代理服务,直接在Burp中完成加解密
  2. 灵活扩展:支持多种实现方式应对不同场景
  3. 动态支持:可处理动态密钥等复杂场景
  4. 易用性:提供丰富示例,常见算法开箱即用

未来发展方向:

  1. 增加更多算法实现
  2. 提供可视化配置界面
  3. 增强错误处理和日志记录
  4. 支持更多动态密钥获取方式
基于Burp Montoya API的报文加密加签场景渗透测试指南 1. 背景与问题概述 在现代Web应用安全测试中,越来越多的系统采用HTTP报文加密/加签传输机制,这给渗透测试工作带来了新的挑战: 无法直接查看和修改明文报文 传统解决方案(如burpy插件、mitmproxy代理)存在使用不便的问题 不同语言实现的加密算法可能存在细微差异,调试耗时 2. 解决方案架构 2.1 整体思路 利用Burp的Montoya API,在请求/响应的四个关键处理节点插入自定义处理逻辑: 请求从客户端到达Burp时 :解密请求 请求从Burp发送到服务器时 :加密请求 响应从服务器到达Burp时 :解密响应 响应从Burp返回客户端时 :加密响应 2.2 技术实现框架 项目名称:Galaxy GitHub地址:https://github.com/outlaws-bai/Galaxy 3. 核心功能实现 3.1 请求过滤机制 采用JavaScript表达式过滤需要处理的请求,默认表达式: 特点: 支持复杂逻辑判断 可自定义修改以适应不同场景 返回boolean值决定是否处理当前请求 3.2 四种实现方式 | 实现方式 | 优点 | 缺点 | 适用场景 | |---------|------|------|---------| | Python | 语法简洁,易上手 | JVM中运行可能有兼容性问题 | 快速实现简单逻辑 | | JavaScript | 前端开发者友好 | 同Python | 简单加解密场景 | | Java | 直接使用Java加密库,无兼容问题 | 需要Java知识 | 复杂加密逻辑 | | gRPC | 跨语言能力强 | 性能较低,学习成本高 | 特殊语言需求 | 3.3 关键处理节点 hookRequestToBurp :客户端→Burp时解密 hookRequestToServer :Burp→服务器时加密 hookResponseToBurp :服务器→Burp时解密 hookResponseToClient :Burp→客户端时加密 4. 动态密钥处理方案 4.1 典型场景 客户端首次请求获取密钥/IV 后续通信使用该密钥加密 密钥可能定期更换 4.2 实现示例 Java实现代码框架: 4.3 关键处理逻辑 密钥获取识别 : 密钥更新处理 : 加解密处理 : 5. 实际应用示例 5.1 测试环境搭建 服务端 (Python): 客户端 (HTML/JavaScript): 5.2 Galaxy配置步骤 安装Galaxy插件 配置Java处理脚本(如4.2节示例) 启动Burp代理 访问测试页面,观察自动加解密效果 6. 支持的加密算法 目前已实现支持: AES-CBC AES-ECB AES-GCM RSA SM2 扩展建议: 在 CryptoUtil 类中添加新算法实现 更新示例脚本提供使用参考 7. 最佳实践建议 表达式优化 : 精确匹配目标系统 排除静态资源请求 示例: request.host.endsWith('target.com') && request.path.startsWith('/api/') 异常处理 : 记录加解密失败日志 提供fallback机制保证正常流量通过 性能考虑 : 对于高并发场景优先选择Java实现 gRPC实现需注意网络延迟 调试技巧 : 使用 log.info() 输出关键变量 在Repeater模块中单独测试加解密逻辑 8. 总结 Galaxy插件的核心优势: 高效集成 :无需额外代理服务,直接在Burp中完成加解密 灵活扩展 :支持多种实现方式应对不同场景 动态支持 :可处理动态密钥等复杂场景 易用性 :提供丰富示例,常见算法开箱即用 未来发展方向: 增加更多算法实现 提供可视化配置界面 增强错误处理和日志记录 支持更多动态密钥获取方式