|
| 1 | +# 瑞数VMP bypass工具 - 综合文档 |
| 2 | + |
| 3 | +> 本项目是完全利用cursor编写的瑞数VMP bypass工具,过程文档目录中是在编码过程中我自己写的一些需求和cursor自己生成的总结文档。 |
| 4 | +
|
| 5 | +## 项目概述 |
| 6 | + |
| 7 | +该工具用于捕获和替换HTTP请求参数,特别针对路径与特定参数的映射关系,主要应用于Burp Suite的请求重放场景。工具可以自动捕获关键参数(如自定义参数和Cookie),并在后续请求中自动替换这些参数,大大提高测试效率。 |
| 8 | + |
| 9 | +最新版本增加了多线程参数预获取和缓存功能,解决了每次请求都需要调用Playwright导致的延迟问题。 |
| 10 | + |
| 11 | +## 需求背景 |
| 12 | + |
| 13 | +### 基本需求 |
| 14 | + |
| 15 | +这个项目旨在解决以下问题: |
| 16 | + |
| 17 | +1. 当用户在burpsuite中使用repeater或intruder重放数据包时,有些特定参数(如LCXcLVWn和Cookie)需要实时捕获 |
| 18 | +2. 这些参数通常在浏览器环境中动态生成,一旦使用就会失效 |
| 19 | +3. 手动获取这些参数非常繁琐,影响测试效率 |
| 20 | + |
| 21 | +### 进阶需求 |
| 22 | + |
| 23 | +在基本功能实现后,我们发现了一些性能问题: |
| 24 | + |
| 25 | +1. Burp Suite插件调用Playwright获取参数和cookie的时候需要一定的时间,导致请求存在明显延迟 |
| 26 | +2. 需要在第一次执行请求时就启动多个线程获取多组未使用的参数,然后缓存起来 |
| 27 | +3. 之后的请求可以直接使用缓存的参数,使用后标记为已使用并删除 |
| 28 | + |
| 29 | +## 实际应用举例 |
| 30 | + |
| 31 | +以下是一个典型的请求示例: |
| 32 | + |
| 33 | +``` |
| 34 | +POST http://xxx:7501/mobileAppServer/100/110?LCXcLVWn=0qvpJZalqWJ_pyGIwbrcmbA6qW8eC6Gyo3mw.ju8JN3eHCLo5N2AfEwwoXGKrFy4Rkk4g4XMq9kk64X.INSQMq0jXihtiuWYCNWf0cu6qaKBYRDCXJ4I6RLPe4EBTYOrJyQeAXj9p5t3 HTTP/1.1 |
| 35 | +Host: xxx:7501 |
| 36 | +Content-Length: 24 |
| 37 | +User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 |
| 38 | +Accept: application/json, text/plain, */* |
| 39 | +DNT: 1 |
| 40 | +Content-Type: application/x-www-form-urlencoded |
| 41 | +Origin: http://xxx:7501 |
| 42 | +Referer: http://xxx:7501/mobileApp/ |
| 43 | +Accept-Encoding: gzip, deflate, br |
| 44 | +Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6 |
| 45 | +Cookie: RrWXLfYMshGCS=60lOjnFBW5QTn5PV8dgLRvGu2bBjM_pqRC5PmtmaE17CgvoclbRqq7eNM_dhXa.ghME3vOEwVjwuFabAegSxHDxA; RrWXLfYMshGCT=050jJCeyBXw9PTJGHuZmERGfkL0waOB46EE3B85egv56sO3ZJddNE7DLBpadpO5XHjUXpLVC0R.w.6Yav6Q7S4O0SGZWEh9ysiKUvnPpPPewjWIoNp1oTOvW0K_bbXzGrLILFF.YyPHSZ1gTYiObqK.eL6nD.EfPYELjK24luAph_9SiKYNViwRKI1DoFu.5ETWw9hTYiofSdEX5vTzMci.wt4EyUWEVh17c1s9ID8dVaS6_HIpg64WCmeoTErzPqXklglTfsqumBNxw2VXZak0Tdl9cyO7L6VVW72sUIYKHhN_8AnzSnWBxGvXfdmrgkWSql3p_h33IujblEshhgp4xZEhXhrFNUDg4X19_uyq1VyeFaL6PPQtkCZUA_yTHRkyYa_HKTvIfoFBCqpC7wAhyfAHs8IKAPZDtCQT9zL4L |
| 46 | +sec-ch-ua-platform: "Windows" |
| 47 | +sec-ch-ua: "Not/A)Brand";v="8", "Chromium";v="118", "Google Chrome";v="118" |
| 48 | +sec-ch-ua-mobile: ?0 |
| 49 | +Connection: keep-alive |
| 50 | +
|
| 51 | +showLoading=false&token= |
| 52 | +``` |
| 53 | + |
| 54 | +这个请求中的LCXcLVWn参数和Cookie是不能直接使用的,需要在浏览器中模拟此请求后自动生成。而且,生成后不能发送数据包,否则这些参数就会失效。我们的工具就是要自动提取在浏览器中生成的这些参数,并在后续请求中使用。 |
| 55 | + |
| 56 | +最新版本支持自定义参数名称,不再局限于"LCXcLVWn",可以根据具体应用场景进行配置。 |
| 57 | + |
| 58 | +## 系统组件 |
| 59 | + |
| 60 | +系统由三个主要组件组成: |
| 61 | + |
| 62 | +1. **Burp Suite插件** (Java) |
| 63 | + - 实现了Burp Suite的扩展接口 |
| 64 | + - 提供用户界面进行配置 |
| 65 | + - 拦截和修改HTTP请求 |
| 66 | + - 与Playwright脚本交互 |
| 67 | + - 管理参数缓存池 |
| 68 | + |
| 69 | +2. **Playwright脚本** (Node.js) |
| 70 | + - 模拟HTTP请求 |
| 71 | + - 拦截请求并提取参数 |
| 72 | + - 通过WebSocket发送参数到服务器 |
| 73 | + |
| 74 | +3. **WebSocket服务器** (Node.js) |
| 75 | + - 接收参数并保存到JSON文件 |
| 76 | + - 提供数据持久化存储 |
| 77 | + |
| 78 | +## 工作流程 |
| 79 | + |
| 80 | +### 基本流程 |
| 81 | + |
| 82 | +1. 当用户在Burp Suite中使用Repeater或Intruder重放数据包时,插件提取数据包内容并通过Playwright模拟 |
| 83 | +2. Playwright拦截此请求不发送,提取相关参数: |
| 84 | + - GET请求:提取路径和Cookie参数 |
| 85 | + - POST请求:提取路径、自定义参数(默认为LCXcLVWn)和Cookie参数 |
| 86 | +3. 捕获的参数通过WebSocket发送到服务器 |
| 87 | +4. WebSocket服务器将数据保存到JSON文件 |
| 88 | +5. Burp Suite插件加载此JSON文件,并在发出请求时自动替换相应参数 |
| 89 | + |
| 90 | +### 优化后的流程(多线程预获取) |
| 91 | + |
| 92 | +1. 首次执行请求时,除了获取当前所需的参数外,还会启动多个线程同时获取多组未使用的参数 |
| 93 | +2. 预获取的参数被缓存到内存中,以供后续使用 |
| 94 | +3. 后续请求时,直接从缓存中获取参数,无需等待Playwright |
| 95 | +4. 当缓存中的参数用完后,自动启动新的预获取任务 |
| 96 | + |
| 97 | +## 新功能说明:多线程参数预获取与缓存 |
| 98 | + |
| 99 | +### 主要改进 |
| 100 | + |
| 101 | +1. **多线程参数预获取** |
| 102 | + - 首次执行请求时,会启动多个线程同时获取多组未使用的参数 |
| 103 | + - 默认启动3个线程,可在界面中自定义线程数 |
| 104 | + - 预获取的参数被缓存到内存中,以供后续使用 |
| 105 | + |
| 106 | +2. **参数缓存管理** |
| 107 | + - 按请求路径分类管理缓存的参数 |
| 108 | + - 使用一组参数后自动从缓存中删除 |
| 109 | + - 当缓存中的参数用完后,自动启动新的预获取任务 |
| 110 | + |
| 111 | +3. **性能优化** |
| 112 | + - 避免每次请求都启动Playwright,大大减少操作延迟 |
| 113 | + - 实现"用一组、补一组"的机制,保证参数供应 |
| 114 | + - 线程池管理,避免创建过多线程 |
| 115 | + |
| 116 | +4. **自定义参数名称** |
| 117 | + - 不再局限于固定的"LCXcLVWn"参数名 |
| 118 | + - 用户可以自定义需要捕获和替换的参数名称 |
| 119 | + - 支持任意名称的参数捕获和替换 |
| 120 | + |
| 121 | +### 配置选项 |
| 122 | + |
| 123 | +1. **预获取线程数** |
| 124 | + - 控制同时启动的预获取任务数量 |
| 125 | + - 默认值:3 |
| 126 | + - 建议值:2-5(根据系统性能调整) |
| 127 | + |
| 128 | +2. **自定义参数名称** |
| 129 | + - 设置需要捕获和替换的自定义参数名称 |
| 130 | + - 默认值:"LCXcLVWn" |
| 131 | + - 可根据目标应用调整为任意参数名 |
| 132 | + |
| 133 | +3. **清除缓存** |
| 134 | + - 提供"清除参数缓存"按钮,可手动清空所有缓存的参数 |
| 135 | + - 当需要重新获取全新参数时使用 |
| 136 | + |
| 137 | +### 使用方法 |
| 138 | + |
| 139 | +1. **激活插件** |
| 140 | + - 点击"激活插件"按钮,启动插件并初始化线程池 |
| 141 | + - 可以根据需要调整"预获取线程数"和"自定义参数名称" |
| 142 | + |
| 143 | +2. **首次请求** |
| 144 | + - 第一次在Repeater或Intruder中发送请求时,插件会实时获取参数 |
| 145 | + - 同时会启动多个线程预获取更多参数用于后续请求 |
| 146 | + |
| 147 | +3. **后续请求** |
| 148 | + - 后续请求会直接使用缓存中的参数,无需等待Playwright |
| 149 | + - 缓存中的参数用完后,会自动获取新的参数 |
| 150 | + |
| 151 | +### 日志说明 |
| 152 | + |
| 153 | +插件日志中增加了以下相关信息: |
| 154 | + |
| 155 | +- `线程池已初始化,线程数: X` - 线程池创建完成 |
| 156 | +- `从缓存获取参数,路径: XXX,剩余: X` - 成功从缓存获取参数 |
| 157 | +- `缓存中没有路径 'XXX' 的参数,启动实时获取` - 缓存未命中 |
| 158 | +- `计划预获取 X 组参数,路径: XXX` - 开始预获取参数 |
| 159 | +- `启动预获取任务 #X,路径: XXX` - 预获取任务开始 |
| 160 | +- `预获取任务 #X 完成,已添加到缓存,当前缓存大小: X` - 预获取任务完成 |
| 161 | +- `参数缓存已清除` - 手动清除缓存操作完成 |
| 162 | + |
| 163 | +## 项目结构 |
| 164 | + |
| 165 | +``` |
| 166 | +. |
| 167 | +├── README.md # 项目说明 |
| 168 | +├── README_新功能.md # 新功能说明 |
| 169 | +├── INSTALL.md # 安装和使用指南 |
| 170 | +├── SUMMARY.md # 项目总结 |
| 171 | +├── burp-plugin/ # Burp Suite插件代码 |
| 172 | +│ ├── build.gradle # Gradle构建文件 |
| 173 | +│ └── src/ # 源代码目录 |
| 174 | +│ └── main/java/com/http/paramcapture/ |
| 175 | +│ └── BurpExtender.java # 插件主类 |
| 176 | +├── playwright-script/ # Playwright脚本代码 |
| 177 | +│ ├── index.js # 脚本主文件 |
| 178 | +│ └── package.json # Node.js依赖配置 |
| 179 | +└── server/ # WebSocket服务器代码 |
| 180 | + ├── server.js # 服务器主文件 |
| 181 | + └── package.json # Node.js依赖配置 |
| 182 | +``` |
| 183 | + |
| 184 | +## 安装步骤 |
| 185 | + |
| 186 | +### 系统要求 |
| 187 | + |
| 188 | +- Burp Suite Professional |
| 189 | +- Node.js 14+ |
| 190 | +- Java JDK 1.8+ |
| 191 | +- Gradle(用于构建Burp插件) |
| 192 | + |
| 193 | +### 1. 安装WebSocket服务器 |
| 194 | + |
| 195 | +```bash |
| 196 | +cd server |
| 197 | +npm install |
| 198 | +``` |
| 199 | + |
| 200 | +### 2. 安装Playwright脚本 |
| 201 | + |
| 202 | +```bash |
| 203 | +cd playwright-script |
| 204 | +npm install |
| 205 | +# 安装Playwright浏览器 |
| 206 | +npx playwright install chromium |
| 207 | +``` |
| 208 | + |
| 209 | +### 3. 构建Burp Suite插件 |
| 210 | + |
| 211 | +```bash |
| 212 | +cd burp-plugin |
| 213 | +gradle build |
| 214 | +``` |
| 215 | + |
| 216 | +构建完成后,JAR文件将位于 `burp-plugin/build/libs/` 目录下。 |
| 217 | + |
| 218 | +## 使用说明 |
| 219 | + |
| 220 | +### 1. 启动WebSocket服务器 |
| 221 | + |
| 222 | +```bash |
| 223 | +cd server |
| 224 | +npm start |
| 225 | +``` |
| 226 | + |
| 227 | +服务器将在端口8081上启动WebSocket服务。 |
| 228 | + |
| 229 | +### 2. 在Burp Suite中加载插件 |
| 230 | + |
| 231 | +1. 打开Burp Suite Professional |
| 232 | +2. 导航到 `Extender` -> `Add` |
| 233 | +3. 选择构建好的JAR文件 |
| 234 | +4. 点击 `Next` 直到插件加载完成 |
| 235 | + |
| 236 | +### 3. 配置插件 |
| 237 | + |
| 238 | +1. 在Burp Suite中打开 `瑞数VMP bypass` 选项卡 |
| 239 | +2. 设置Node.js路径(默认为 `/usr/local/bin/node`) |
| 240 | +3. 设置Playwright脚本路径(默认为用户主目录下的 `playwright-script`) |
| 241 | +4. 设置JSON文件路径(默认为用户主目录下的 `server/params-data.json`) |
| 242 | +5. 设置自定义参数名称(默认为 `LCXcLVWn`) |
| 243 | +6. 设置预获取线程数(默认为 `3`) |
| 244 | +7. 点击 `激活插件` 按钮启用功能 |
| 245 | + |
| 246 | +### 4. 使用插件捕获和替换参数 |
| 247 | + |
| 248 | +1. 在Burp Suite的Repeater或Intruder中发送请求 |
| 249 | +2. 插件将自动捕获请求并通过Playwright模拟 |
| 250 | +3. 捕获的参数将通过WebSocket发送到服务器并保存到JSON文件 |
| 251 | +4. 后续请求将自动使用保存的参数,实现参数替换 |
| 252 | + |
| 253 | +## 注意事项 |
| 254 | + |
| 255 | +1. 预获取操作在后台进行,不会阻塞UI或其他操作 |
| 256 | +2. 建议根据系统性能和网络状况调整线程数 |
| 257 | +3. 如果参数泄露或失效,可以使用"清除参数缓存"重新获取 |
| 258 | +4. 确保Playwright脚本和WebSocket服务器正在运行 |
| 259 | +5. 插件默认每10秒重新加载一次参数数据,也可点击 `重新加载参数数据` 按钮手动加载 |
| 260 | +6. 日志区域显示插件的运行状态和错误信息 |
| 261 | + |
| 262 | +## 故障排除 |
| 263 | + |
| 264 | +### 无法连接到WebSocket服务器 |
| 265 | + |
| 266 | +- 确保WebSocket服务器正在运行 |
| 267 | +- 检查防火墙设置是否允许端口8081的连接 |
| 268 | +- 检查服务器地址是否正确(默认为 `ws://localhost:8081`) |
| 269 | + |
| 270 | +### 参数未被捕获 |
| 271 | + |
| 272 | +- 检查Playwright脚本路径是否正确 |
| 273 | +- 确保Node.js已正确安装 |
| 274 | +- 查看插件日志区域中的错误信息 |
| 275 | + |
| 276 | +### 参数未被替换 |
| 277 | + |
| 278 | +- 确保插件已激活 |
| 279 | +- 检查JSON文件路径是否正确 |
| 280 | +- 尝试手动点击 `重新加载参数数据` 按钮 |
| 281 | + |
| 282 | +### 性能问题 |
| 283 | + |
| 284 | +- 增加预获取线程数可能提高性能,但会消耗更多系统资源 |
| 285 | +- 减少预获取线程数可能降低性能,但会减少资源消耗 |
| 286 | +- 根据实际情况进行调整 |
| 287 | + |
| 288 | +## 未来改进方向 |
| 289 | + |
| 290 | +1. **支持更多参数类型**:扩展对更多HTTP参数类型的支持 |
| 291 | +2. **多会话支持**:支持多个测试会话的参数隔离 |
| 292 | +3. **参数智能分析**:添加参数变化监测和智能分析功能 |
| 293 | +4. **自动化测试**:添加自动化测试脚本,确保功能稳定性 |
| 294 | +5. **性能优化**:进一步优化参数处理和替换的性能 |
| 295 | +6. **更丰富的统计信息**:提供更详细的参数使用统计和性能指标 |
| 296 | +7. **更多浏览器支持**:扩展对Firefox、Edge等浏览器的支持 |
| 297 | + |
| 298 | +## 安全考虑 |
| 299 | + |
| 300 | +1. **本地处理**:参数数据保存在本地,不涉及远程传输敏感数据 |
| 301 | +2. **无网络泄露**:Playwright拦截请求不实际发送,避免测试请求泄露 |
| 302 | +3. **访问控制**:WebSocket服务器仅在本地运行,减少外部访问风险 |
0 commit comments