From 0d262cb30b9daba73e2e3520e1d33d411997ecfe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AC=E6=98=8E?= <83812544+Ed1s0nZ@users.noreply.github.com> Date: Fri, 27 Mar 2026 22:27:03 +0800 Subject: [PATCH] Add files via upload --- README.md | 8 + README_CN.md | 8 + plugins/README.md | 12 + .../cyberstrikeai-burp-extension/README.md | 68 ++ .../README.zh-CN.md | 108 +++ .../cyberstrikeai-burp-extension/build-mvn.sh | 45 ++ .../cyberstrikeai-burp-extension/build.gradle | 45 ++ .../cyberstrikeai-burp-extension/build.sh | 35 + .../dist/cyberstrikeai-burp-extension.jar | Bin 0 -> 37918 bytes .../cyberstrikeai-burp-extension/pom.xml | 44 ++ .../settings.gradle | 2 + .../src/main/java/burp/BurpExtender.java | 138 ++++ .../main/java/burp/CyberStrikeAIClient.java | 234 ++++++ .../src/main/java/burp/CyberStrikeAITab.java | 724 ++++++++++++++++++ .../main/java/burp/HttpMessageFormatter.java | 66 ++ .../src/main/java/burp/MarkdownRenderer.java | 195 +++++ .../src/main/java/burp/SimpleJson.java | 80 ++ .../target/classes/burp/BurpExtender$1.class | Bin 0 -> 3939 bytes .../target/classes/burp/BurpExtender.class | Bin 0 -> 4961 bytes .../burp/CyberStrikeAIClient$AgentMode.class | Bin 0 -> 1228 bytes .../burp/CyberStrikeAIClient$Config.class | Bin 0 -> 741 bytes .../CyberStrikeAIClient$StreamListener.class | Bin 0 -> 400 bytes .../classes/burp/CyberStrikeAIClient.class | Bin 0 -> 10691 bytes .../classes/burp/CyberStrikeAITab$1.class | Bin 0 -> 951 bytes .../burp/CyberStrikeAITab$DotIcon.class | Bin 0 -> 1786 bytes .../burp/CyberStrikeAITab$TestRun.class | Bin 0 -> 1131 bytes ...CyberStrikeAITab$TestRunCellRenderer.class | Bin 0 -> 4325 bytes .../classes/burp/CyberStrikeAITab.class | Bin 0 -> 25917 bytes .../classes/burp/HttpMessageFormatter.class | Bin 0 -> 3902 bytes .../classes/burp/MarkdownRenderer.class | Bin 0 -> 5149 bytes .../target/classes/burp/SimpleJson.class | Bin 0 -> 3062 bytes .../cyberstrikeai-burp-extension-1.0.0.jar | Bin 0 -> 37918 bytes .../target/maven-archiver/pom.properties | 3 + .../compile/default-compile/createdFiles.lst | 14 + .../compile/default-compile/inputFiles.lst | 6 + 35 files changed, 1835 insertions(+) create mode 100644 plugins/README.md create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/README.md create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/README.zh-CN.md create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/build-mvn.sh create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/build.gradle create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/build.sh create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/dist/cyberstrikeai-burp-extension.jar create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/pom.xml create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/settings.gradle create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/BurpExtender.java create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/CyberStrikeAIClient.java create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/CyberStrikeAITab.java create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/HttpMessageFormatter.java create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/MarkdownRenderer.java create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/SimpleJson.java create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/BurpExtender$1.class create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/BurpExtender.class create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient$AgentMode.class create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient$Config.class create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient$StreamListener.class create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient.class create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$1.class create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$DotIcon.class create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$TestRun.class create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$TestRunCellRenderer.class create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab.class create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/HttpMessageFormatter.class create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/MarkdownRenderer.class create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/SimpleJson.class create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/target/cyberstrikeai-burp-extension-1.0.0.jar create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-archiver/pom.properties create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst diff --git a/README.md b/README.md index 06296f94..2f28f928 100644 --- a/README.md +++ b/README.md @@ -97,6 +97,14 @@ CyberStrikeAI is an **AI-native security testing platform** built in Go. It inte - 📱 **Chatbot**: DingTalk and Lark (Feishu) long-lived connections so you can talk to CyberStrikeAI from mobile (see [Robot / Chatbot guide](docs/robot_en.md) for setup and commands) - 🐚 **WebShell management**: Add and manage WebShell connections (e.g. IceSword/AntSword compatible), use a virtual terminal for command execution, a built-in file manager for file operations, and an AI assistant tab that orchestrates tests and keeps per-connection conversation history; supports PHP, ASP, ASPX, JSP and custom shell types with configurable request method and command parameter. +## Plugins + +CyberStrikeAI includes optional integrations under `plugins/`. + +- **Burp Suite extension**: `plugins/burp-suite/cyberstrikeai-burp-extension/` + Build output: `plugins/burp-suite/cyberstrikeai-burp-extension/dist/cyberstrikeai-burp-extension.jar` + Docs: `plugins/burp-suite/cyberstrikeai-burp-extension/README.md` + ## Tool Overview CyberStrikeAI ships with 100+ curated tools covering the whole kill chain: diff --git a/README_CN.md b/README_CN.md index eeb0fc41..36bd1dfe 100644 --- a/README_CN.md +++ b/README_CN.md @@ -96,6 +96,14 @@ CyberStrikeAI 是一款 **AI 原生安全测试平台**,基于 Go 构建,集 - 📱 **机器人**:支持钉钉、飞书长连接,在手机端与 CyberStrikeAI 对话(配置与命令详见 [机器人使用说明](docs/robot.md)) - 🐚 **WebShell 管理**:添加与管理 WebShell 连接(兼容冰蝎/蚁剑等),通过虚拟终端执行命令、内置文件管理进行文件操作,并提供按连接维度保存历史的 AI 助手标签页;支持 PHP/ASP/ASPX/JSP 及自定义类型,可配置请求方法与命令参数。 +## 插件(Plugins) + +可选集成在 `plugins/` 目录下。 + +- **Burp Suite 插件**:`plugins/burp-suite/cyberstrikeai-burp-extension/` + 构建产物:`plugins/burp-suite/cyberstrikeai-burp-extension/dist/cyberstrikeai-burp-extension.jar` + 说明文档:`plugins/burp-suite/cyberstrikeai-burp-extension/README.zh-CN.md` + ## 工具概览 系统预置 100+ 渗透/攻防工具,覆盖完整攻击链: diff --git a/plugins/README.md b/plugins/README.md new file mode 100644 index 00000000..a33e6f2a --- /dev/null +++ b/plugins/README.md @@ -0,0 +1,12 @@ +## Plugins + +This directory contains optional plugins/extensions that integrate CyberStrikeAI with other tools. + +- `burp-suite/`: Burp Suite extensions + +### Burp Suite Extension + +- **Path**: `plugins/burp-suite/cyberstrikeai-burp-extension/` +- **Build output**: `plugins/burp-suite/cyberstrikeai-burp-extension/dist/cyberstrikeai-burp-extension.jar` +- **Docs**: see the plugin folder `README.md` / `README.zh-CN.md` + diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/README.md b/plugins/burp-suite/cyberstrikeai-burp-extension/README.md new file mode 100644 index 00000000..321fd637 --- /dev/null +++ b/plugins/burp-suite/cyberstrikeai-burp-extension/README.md @@ -0,0 +1,68 @@ +## CyberStrikeAI Burp Suite Extension + +中文说明见:`README.zh-CN.md` + +### What it does + +- Configure **Host / Port / Password** and choose **Single-Agent** or **Multi-Agent** +- Click **Validate** to login (`POST /api/auth/login`) and verify token (`GET /api/auth/validate`) +- Right-click any HTTP message in Burp and send it to CyberStrikeAI for **streaming web pentest** +- Keep a **test history sidebar** (searchable) so you can revisit previous runs +- Output is split into **collapsible Progress** + **Final Response** (Markdown rendering supported) +- View captured **Request / Response** for each run +- **Stop** a running task (calls `/api/agent-loop/cancel` once `conversationId` is available) + +### Build + +Requirements: + +- JDK 11+ +- Maven (recommended) OR Burp Extender API jar (offline mode) + +#### Option A (recommended): Maven build (no need to locate Burp) + +```bash +cd plugins/burp-suite/cyberstrikeai-burp-extension +./build-mvn.sh +``` + +Output: + +- `dist/cyberstrikeai-burp-extension.jar` + +#### Option B: Offline build with `build.sh` (needs Burp API jar) + +1) Create `lib/` and copy Burp's API jar into it: + +```bash +mkdir -p lib +# copy from your Burp installation, for example: +# cp "/path/to/burp-extender-api.jar" lib/ +``` + +2) Build: + +```bash +cd plugins/burp-suite/cyberstrikeai-burp-extension +./build.sh +``` + +Output: + +- `dist/cyberstrikeai-burp-extension.jar` + +#### Option C: Gradle (optional) + +If you already have Gradle available, you can still use `build.gradle` to build. + +### Load in Burp Suite + +- Burp Suite → **Extensions** → **Installed** → **Add** +- Extension type: **Java** +- Select the jar above + +### Notes + +- This extension connects to your CyberStrikeAI server (default is `http://127.0.0.1:8080`). +- It uses **Bearer Token** authentication obtained from the configured password. + diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/README.zh-CN.md b/plugins/burp-suite/cyberstrikeai-burp-extension/README.zh-CN.md new file mode 100644 index 00000000..d50a96fe --- /dev/null +++ b/plugins/burp-suite/cyberstrikeai-burp-extension/README.zh-CN.md @@ -0,0 +1,108 @@ +## CyberStrikeAI Burp Suite 插件(中文说明) + +### 功能概述 + +- 在 Burp 的 `CyberStrikeAI` 标签页中配置 **Host、端口、密码、单/多 Agent** +- 点击 **Validate(验证)**: + - 调用 `POST /api/auth/login` 用密码换取 Token + - 调用 `GET /api/auth/validate` 校验 Token + - 验证通过后 Token 会保存在插件内存中(本次 Burp 会话有效) +- 右键任意 HTTP 请求包 → **Send to CyberStrikeAI (stream test)**: + - 将该 HTTP 请求(含 headers/body;若存在响应则附带截断片段)发送到 CyberStrikeAI + - 以 **SSE 流式**接收返回内容,并在标签页中实时展示 + - 单 Agent:`POST /api/agent-loop/stream` + - 多 Agent:`POST /api/multi-agent/stream`(需要服务端启用 `multi_agent.enabled: true`) +- **测试历史侧边栏(可搜索)**:每次发送都会新增一条记录,方便回看与对比 +- **Output 分区**:`Progress`(可折叠)+ `Final Response`(主区域) +- **Markdown 渲染**:最终输出可在 Output 主区域渲染为富文本(可开关) +- **Request / Response 回看**:右侧 Tab 可直接查看该次捕获到的原始请求/响应 +- **Stop 取消**:任务创建会话后可调用 `/api/agent-loop/cancel` 停止当前会话任务 + +### 编译(不依赖 Gradle/Maven,推荐) + +> 给普通用户:你们应当直接发 **编译好的 jar**,用户在 Burp 里加载即可,**不需要编译**。 + +#### 方式 A(推荐,通用):用 Maven 编译(不需要知道 Burp 在哪) + +适合:开发者/CI 打包一次,发布给所有用户使用。 + +环境要求: + +- JDK 11+ +- Maven(会从 Maven Central 下载 `burp-extender-api` 依赖) + +编译打包: + +```bash +cd plugins/burp-suite/cyberstrikeai-burp-extension +./build-mvn.sh +``` + +产物: + +- `dist/cyberstrikeai-burp-extension.jar` + +#### 方式 B(离线):纯 JDK 编译(需要 Burp 的 API jar) + +- JDK 11+ +- Burp Extender API 的 jar(来自你的 Burp 安装目录) + +#### 步骤 + +1) 在插件目录创建 `lib/`,并把 `burp-extender-api.jar` 复制进去: + +```bash +cd plugins/burp-suite/cyberstrikeai-burp-extension +mkdir -p lib +# 复制 Burp 自带的 API jar 到这里,例如: +# cp "/path/to/burp-extender-api.jar" lib/ +``` + +2) 一键编译打包: + +```bash +cd plugins/burp-suite/cyberstrikeai-burp-extension +./build.sh +``` + +产物: + +- `dist/cyberstrikeai-burp-extension.jar` + +### 在 Burp Suite 中加载 + +- Burp Suite → **Extensions** → **Installed** → **Add** +- Extension type:**Java** +- 选择 `dist/cyberstrikeai-burp-extension.jar` + +### 使用方法 + +1) 打开 Burp 顶部标签页 `CyberStrikeAI` +2) 填写: + - **Host**:例如 `127.0.0.1` + - **Port**:例如 `8080` + - **Password**:你的 CyberStrikeAI 登录密码(对应服务端 `config.yaml` 的 `auth.password`) + - **Agent mode**:选择 `Single Agent` 或 `Multi Agent` +3) 点击 **Validate** + - 成功:状态显示 `OK (token saved)` + - 失败:状态会显示错误原因(例如密码错误、服务不可达、401/403 等) +4) 在 Burp 的 Proxy/HTTP history/Repeater 等列表中选中一条 HTTP 包 +5) 右键 → **Send to CyberStrikeAI (stream test)** +6) 每次发送后会在 `CyberStrikeAI` 标签页左侧显示一个“测试记录”(请求标题 + 单/多 Agent + 状态);点击对应记录即可在右侧查看该次的流式输出结果 + +### 常见问题(排错) + +- **Validate 失败 / 401** + - 确认密码是否正确(服务端 `auth.password`) + - 确认 IP/端口是否能访问(例如浏览器能打开 `http://IP:PORT/`) + - 若服务器启用了反向代理/HTTPS,需要把插件里 baseUrl 改成对应协议与端口(当前插件默认使用 `http://`) + +- **选择 Multi Agent 后提示“多代理未启用”** + - 服务端需要开启:`config.yaml` 中 `multi_agent.enabled: true` + - 并重启服务(或按你们项目的动态 apply 配置流程启用) + +- **右键发送后无流式输出** + - 先确认已 Validate(拿到 Token) + - 确认 Burp 能访问到 CyberStrikeAI(网络/代理/防火墙) + - 服务端的流式端点为 SSE,插件会解析 `data: {json}` 行;如果中间件缓冲可能影响实时性 + diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/build-mvn.sh b/plugins/burp-suite/cyberstrikeai-burp-extension/build-mvn.sh new file mode 100644 index 00000000..075d8895 --- /dev/null +++ b/plugins/burp-suite/cyberstrikeai-burp-extension/build-mvn.sh @@ -0,0 +1,45 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +DIST_DIR="$ROOT_DIR/dist" + +MVN_BIN="" +if command -v mvn >/dev/null 2>&1; then + MVN_BIN="mvn" +else + # Auto-provision Maven for developer convenience. + # This is only used to build the jar once in CI/dev; Burp users don't need to run this. + MAVEN_VERSION="3.9.6" + BASE_DIR="${HOME}/.cache/cyberstrikeai-burp-extension" + MAVEN_DIR="$BASE_DIR/apache-maven-$MAVEN_VERSION" + MAVEN_TGZ="$BASE_DIR/apache-maven-$MAVEN_VERSION-bin.tar.gz" + MAVEN_URL="https://archive.apache.org/dist/maven/maven-3/$MAVEN_VERSION/binaries/apache-maven-$MAVEN_VERSION-bin.tar.gz" + + if [[ -x "$MAVEN_DIR/bin/mvn" ]]; then + MVN_BIN="$MAVEN_DIR/bin/mvn" + else + echo "[*] Maven not found. Downloading Maven $MAVEN_VERSION ..." + mkdir -p "$BASE_DIR" + if command -v curl >/dev/null 2>&1; then + curl -fsSL "$MAVEN_URL" -o "$MAVEN_TGZ" + elif command -v wget >/dev/null 2>&1; then + wget -q "$MAVEN_URL" -O "$MAVEN_TGZ" + else + echo "Missing: curl/wget (needed to download Maven)." + exit 1 + fi + tar -xzf "$MAVEN_TGZ" -C "$BASE_DIR" + MVN_BIN="$MAVEN_DIR/bin/mvn" + fi +fi + +rm -rf "$DIST_DIR" +mkdir -p "$DIST_DIR" + +echo "[*] Building with Maven (downloads Burp API from Maven Central)..." +(cd "$ROOT_DIR" && "$MVN_BIN" -q -DskipTests package) + +cp "$ROOT_DIR/target/cyberstrikeai-burp-extension-1.0.0.jar" "$DIST_DIR/cyberstrikeai-burp-extension.jar" +echo "[+] Done: $DIST_DIR/cyberstrikeai-burp-extension.jar" + diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/build.gradle b/plugins/burp-suite/cyberstrikeai-burp-extension/build.gradle new file mode 100644 index 00000000..4bd43d59 --- /dev/null +++ b/plugins/burp-suite/cyberstrikeai-burp-extension/build.gradle @@ -0,0 +1,45 @@ +plugins { + id 'java' + id 'com.github.johnrengelman.shadow' version '8.1.1' +} + +group = 'ai.cyberstrike' +version = '1.0.0' + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(11) + } +} + +repositories { + mavenCentral() +} + +dependencies { + // Burp Extender API (legacy). Burp will provide the interfaces at runtime, but we compile against it. + implementation 'net.portswigger.burp.extender:burp-extender-api:2.3' + + // JSON parsing for SSE payloads. + implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.2' +} + +tasks.withType(JavaCompile).configureEach { + options.encoding = 'UTF-8' + options.release = 11 +} + +jar { + manifest { + attributes( + 'Main-Class': 'burp.BurpExtender' + ) + } +} + +shadowJar { + archiveBaseName.set('cyberstrikeai-burp-extension') + archiveClassifier.set('all') + archiveVersion.set('') +} + diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/build.sh b/plugins/burp-suite/cyberstrikeai-burp-extension/build.sh new file mode 100644 index 00000000..a3e298b5 --- /dev/null +++ b/plugins/burp-suite/cyberstrikeai-burp-extension/build.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +LIB_DIR="$ROOT_DIR/lib" +DIST_DIR="$ROOT_DIR/dist" +BUILD_DIR="$ROOT_DIR/.build" + +API_JAR="$LIB_DIR/burp-extender-api.jar" + +if [[ ! -f "$API_JAR" ]]; then + echo "Missing: $API_JAR" + echo "Please copy Burp's burp-extender-api.jar into plugins/burp-suite/cyberstrikeai-burp-extension/lib/" + exit 1 +fi + +rm -rf "$BUILD_DIR" "$DIST_DIR" +mkdir -p "$BUILD_DIR" "$DIST_DIR" + +SRC_FILES=$(find "$ROOT_DIR/src/main/java" -name "*.java") + +echo "[*] Compiling..." +javac \ + -encoding UTF-8 \ + --release 11 \ + -cp "$API_JAR" \ + -d "$BUILD_DIR" \ + $SRC_FILES + +echo "[*] Packaging..." +JAR_OUT="$DIST_DIR/cyberstrikeai-burp-extension.jar" +jar --create --file "$JAR_OUT" --main-class burp.BurpExtender -C "$BUILD_DIR" . + +echo "[+] Done: $JAR_OUT" + diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/dist/cyberstrikeai-burp-extension.jar b/plugins/burp-suite/cyberstrikeai-burp-extension/dist/cyberstrikeai-burp-extension.jar new file mode 100644 index 0000000000000000000000000000000000000000..ae3e6ead5a827a8770d745607db54ebf50f69497 GIT binary patch literal 37918 zcmagF1B@m>m@V42ZA{z#+qP}nw(V)#HmB{Lp0;iOZDZPev%A^cz3<)JS4kz6s#BHo zrM^_1RO%?nfSFY1Nk2X_Fr3GTuqokT0w$I=^qT^9}MO{VXDwk9}fS9 zo&ME-z5fd)FRUOfA+D;%C@+CH#0v+;f&wxZV06ulEj6c}<7V+o8)l4gO_FWG2q(i& z%(0=ti?n*H6X3e9a#R-I<`K$_6(5&!XDCV9r)|wM<2Lh2D#P2|4jyuooRYP$NKdy* zfCwFiB0imIS{Gm6Tf6ej>yKv(3<9+{{Txmeqp|6k_v{{PPXAL|%fGyDf{26Hbra|c&z$NwVrzcxYN zQfBFm2?T`S90Uaazk?M04<4%j$wOFL&Dey|)Xvz|wbdWiNNsufyYsovj4}n9933o- zG zJUE28e74`(OZ3YwIr7n>P`M3CTT|77<;k?p>gEFii#0XkV9&AAkdDM$Q1%19T8A~) zSPsB>LoA7+iHMUJMXw+_fuOB7L{yOo^!)U1(rGz8wNpklQ%X}h2TE`yAnx?1Mw;meL^-`%oCH)*U&MFF73kp`(R~;&p&n8@& zj-%Cwj9rIJU#-A~pQ8^da8AC4^fbK4%J{==F0`aBl-PDbhX;vWvbfL6S1jSC{Iv^{ z&;FG1(<1Ny>UL9JDQ~Omc<%TQWuWN$o5(k%6b+D+xXyIF-g4c8Ge|w%4xExu5nsp$ z0)A@$)%EeA1+C393`PgyQTyBx5)EVJ?GJvoNRF;|YofG$kB)=Z^Kf@de1t0U?{szC zr+2=V`KDNp6u`U%OgjUC4)K%ZkFCwPn3oo~{HEnn^oLaUU=2g3Do3{Gj#Kifb5?5y zRT4ZnwwR7HOB8F2SUIcsHX#8)Y%wC9Bn5MeJW4A&Jd4LL;))zMsJ!Sa-OH4Fq!2h8 zpEUv(zR5PkxFq#HCshKOc3nBH)zZJGevQnf?m3cTwWQ9WQdw26PDRq#EY%iN)4(Ug z><2oBXRRyQ;JPipD(MVoSBKn1^`ezZrnz(E?o*e!-L(Cp$DqUxVZG=@#x_gL0JpOe zq7C5-uW4JkuJrm)^-iQ2@0rFK#rdOo2=YoEsD_3J5cMNEfgNXE0h|)FarRTGx`alrWcz2!n z4d)rC4~jvvay$5itxt9+g=vUPOUp({@Lt%6lC7yPjs|MpUTlO8SR6X-qiI!O9&ue9 zNpGmfFDQXjU_%$l9Z?EVxg<#O{2Wvu9VI+%%`1}!sD8r0EIFG=d|)0jQ4uA|{20;0 zT*-=a0lPI5KjdwU2&F=MVG+lBPCQ|Luz`CxvzyPUwNL!)GvABGl6mxy-bEr)_5<2y zHnO!NLTuGpTcJjtrkqcj^^`s~jD+(Lr6t3)|90u_t%!vS6ExJDpJV0&CGYJej8o6A zb&vhP#^`n&o?UF~`o~u9)9003PdT5Aodc4xUQF6$s_18&a_P6_B9ZvJZLLED@nVPq)8DFT3(@F<-&Ii;MVC?7)O-;cHioap0ZwICqiZ&4)b~ z1tHDp#pITzg7^F7-qOF~Ko(cS@S=!?laJN_qretpTB{{|f)Up!E)xbe+>Sm&si1*22to@1>ILZ}@?dJd! zApJlOm1EID2u@vnFNq!eiQbsf^&2)I9&cpXtw1e_0xHV5oEjr4f-UD0p)o|P6?&R1 ztD=M?FgID67SmLYMFYe5RjU2y9lK1I&^wA+!6WH!NYS+ON&;Jq-0?vNrbF=9 zY9_Hsvq!YF5`aZp$ytX3Kcjx0q1-5VSV^;82<0+uV&ilf|>6TMq|+g^*q0r&RSEODx+3@%;Ii85Ont7`Z7SYf`VU95!Y{g8zN?}u^Q6;5UF#uZJ*gLRj zl0<{mtn&+@`=M({Maxn|rIDz8FQ{{76|d@VB=`lNNwn5Lq;^)KC+m!s&3#KH=P+%s z(0Vw77jC6(GD4>~-3UuiVvF@brMVMkP%~{HvsHK*2=uRrl*Ni+=knWVs95ZA@HM<{ z?&3qxwMAL-Y`J~x+ZM_nFCKyFY^TrQQx@1|&fkS)#Wg&qRy}l@N`zrIY#K=s@2H_S9Jj+vRicV=<*DO*;@w^J?VmiRDo?6;LKxoz4)PhiQE7m zuB&CY_{0Q|Zyw&CP%~DKVw3-+PZBa4-bkxj%3gd50Cl(<{DZR5K} zJZqE7n|l2^Lu;@n=3GR>h=zU9K{1gP-VhvWS7L?v_gS-$jAj>Sm%s)w`~>2Mz3{Gv z*p>a46Z>9*S+wl1IpeQEjEq=1AZWtzgB{Gyjp(&Ky>6GE1K;iWg64pjo_S2oFh{Ns z$@&~=L+{&4D#XOo>6!mWba8&5zGDpji`eBgR_kjbgjsaX&@`iSER6@;(0gx63k?of z1DnQ7g8|gNi%r*))rJG-Fd~P3Io>R2HdmvGGdF)prg8AD|b4(w(y43Av%)C8>B5DM{4#y zp7vy*Y0PfSu5jtaL9nXHH+y^NSio=&<;t7CO(G8R*n;_|i2*su8v&ocrlE8H1Qr$dBC0TG2@^)%*t6#hL>l!tj`|f!ux|XQ5J=K2gbVW$xr^@Pce4ulE)op^)$V#Ocdld zP52}rZ8!}SiN1C`-`PBJ(BO;$RS9J|Oz$}^L1IQ%f1Ghkj6IzpZ?a|LGD79JGb8b= zY=os4BePvH>07igk-2dPN9*c=cVsVfWZdxv`oo)DM^>uwNu~qUSi4YywZ-$;`nXXd zpgLsAhPLd*pBn>ux@BaIYVmC5EVh`IpzaXwKV*WQ>)rY2WLo>%ycQwg7=70-f`R>sX4JGWBl$diM?dd(j{tXif$T%AFn1y@~Xit!n8GN)Tsb6nC6 zyB{LzlmpGQ$8@y&+cWcyJG2Yma8!vVv5AP@O`QJ;y%gtM8h<&_ww=+9v`EhErszn^ z(Hs277k8IlSwIdeNkRe@@7+6*RCgTVW=kl%*MjwY39HovmIg)ys)qs*Zn8aN=X|O$ z?ipInx+gbIHF}cx#mlWeJ9WV3;6+=G3%Vht4~VyGsLpeu!x%&P)&@sbGXtT6M84HT z3K!%a`%hBD`Bc87tiTwWz?lsCPO1HYJPW!BZPZ&^sJw|Mm+V58Gd;Oy%Hzkga=uXS zJnP=KTa~sghl%FHb%MB7vM+jGq0D;hFpoBu7v24&lZn52_kOAdBusMNu$rU&8KP#O zNdBZdLKo%##22DUypxQ^c`c^{B)a!6n!s_fCyCU)apL%wwP{V)C~78_qq2`ClG)Xj z2s`Iru19ecUgt=v28^gWmVlN9-O+apH`V!d0)eK+L-l)`jGmFy)rpJC587!iB=Sdt zY))w7ySvA%TzolivXq0Z>Dd)C@9|VlwoOM=cGv!3r37DY`U86hjwAaX`L+Oj^xcw- zo-E!Q_9Okbw|O6R)6L8bpUJD*%;)TT0jO;=?3R$n+!Fz#325(n1a_8glk!V50#`|U zoLd#*R}^Bi_QJMM!7*X(XmV<~Ko>x8r2H!kzEng2-PqG}BeqS`wruCU1(WxyX8zV> zBMf6qbuZ(x3A>z+X$LnGg7ltUT~sEXw^Q7 z-3S7_Ixha?7ce0vt>sJjRhFmw8tA83#YtzP*L=TS3PI+h$SJrBwxE~TKSRrM7VPYT z8)#+_Z)>RqL!>nm*b+k+F%WAQ&4&et6^yTzssWVWKdd@-Iyg|W=c4>saQq%x0k41L z)inqYy{j*<>hb_rb7!_xckek4Y?n#d(1GR^&yXUhUYYrlKM<1wLp40-aiJC)jON(K z82Yiu`L+_rgU|crUKwH~s3g8t9{uF|lmjly`dpa)oI?j?(|xUl-n{KM#&F>2aCP$p;2EMTr{Q{p^c*LW>5doFa*HOCUJ&r;Wj zX}cE{Oj6^vuMybNXw}Sw!k~u@hb{48jKJ_S0JkauE} zV&zhG$!JJUZ#yzX$#hg>(5SMkt90-^A%l#RyhRJWubV+QQSF9zpiFcW?xk)ZqjNna zk3D!>>!nEwT28A3UIh9Ck3%Pb$&TiH02-ndbd15VrY5>ptB2UQb7Wlk zv2BxC1;@Q}ZfUOH+^*rCl&%{W^fW?YO;|ODD<8`NzY$BHO4snxN+%#Q#|X*BtTs zMme&QhS9yUs=Rs-_~(Qm>jsSzA_&l#i>=cDpV!tm?g{2$3(3T>t#(u`l9;hQpg~Xr znQLnc^U9@+m&FIKa}yikUx&(-13Oa)myu0s<@TnWE|#~cn!rP_rPi!gCOZvKPs;`` z5&Zq8Au{`n9*`HXjP)oq&)S_>s?OigW!3DjOx>XJSI(V$FhAhAH0e)WBHBY!f58Cg zNCNRqQOQxXgE}~uR7SYFQ9y*2?+$2hNEWgzk04{;Y z==>(>JUeRmI4#<^SH7j$N+pz8-MVti6Up}y3m)xRHl_skCl~F^S!@OUx!;|CN;Z}$ zGdAq18EkAn@>LfNE@A*rM~xK`Ph^W<&6R)Y6P&h37I5WIjTnKqnDnJ?a5B~|vRO(e|M3dJ?GQcwQ@aLHUo}a+oQM}X|W8s(hipP=j)~W(qT85a7RBW z9)w!$i*uLnp>bsDGhoE&1r$u!z*y!v0S(DwK0q;j3H655jMQ|DOQP$V1sYmN6w;u@rc1% zV$J81t1zeVO4re&%5QwbUJ7`Q8H{nVHIEW7DW%)4=!3>oLd*3RPP_=_jj&bmL{Va{ zpD{ZXTzl|!A%#p2Crv@l&gXAPpHwxA>FTnO(O|{yqL)rCoeoMH+!zA!W(Vj(V^(Af z3l7{Yd^p1{{KW8&jUg&$2eA_9UU#Cm*W82V^;d8O#rN;LXH8H#tKh zLI1pp5fq_#a?T?5#J|p}!nOnAPAnHerk`;x$jlt$Z*sG;MSC3~7s>fCh|_cWy}+Q^ zW4utabRi!F#*wu{)-c02&8#UUbmQ=;G$BYrK6|WF_br2C!-1XU5ApYHSER5~HG3@a z$S$bJq*gbp8~wgYV4Gw90#j;0p7mVwh&yxcKJ?G(LN+_xSL=iPhZ;r2UB0v={r)DU zU`qP4m^VDEH=U0&N#g82Z9d@QQbz&uJ5UW9lJ*~;KgVGS<-I{CG31%f$G!jQ z=0wVlOD-^;`C4?RFCQ?zq&VS>F8C(-9l$F-iGb^D9(o?eU!mZPa+9e6#PIJb_|{1L z&miKt%mN#y18+>BC6V0XmDvCRAZwFP&qV=xj0Ptw*wIvkXaWhFbj;MSRf#{<% zZZFC@Zm+y39<8K*RD_~J>vd`lIo}Y zDqJUEOReB^L#m$C@l(kE6fm+EHtqD|2%R#@WgiejU(kp(Yywh4t;Y~gLr;gnof=(b z&gb4!wX@n9t(Rj~{cMF|6X|3hQ?+xH{ei24bdYXc?xWiqs>8iXEBBb5&l_qhnR$-v zb4_2bo_+qzK4z~L9JV|>iV+gl$xOI^XEc<=XVO)N|Fh%%;|GdrdPwZ?Ag_pYfC5h$fVDkZTndMrt!IHUmIagP9Z;& z>~MhNWMR;=LA9uL!4l8r$5=AJj)zFH92Hik-M)uz)3PD5(&v76gVn5?Y|BKEQ^7y3 z68GA-QeG&?T1| z2!Jg>{HQ6i*bF>q5@ys<9?4B51GQC<_|lvDsR?RPY=Tr;Bu|!Xd@>MJBJ4y7ue_k- z(vl_Z^yJ@L^4eeJ^mDK!OVu=o0!KmHs}q&?&V_*bvV(`eUK@o4_D`xEh9Q{hj)Od{vgUX;h)hg8*mn8%FM zRfSKJB}4hMZ+V&T9Dv|X*>mobVeyx-%BN;!phVz4Yv5|!iQ0#m5~YM*$O!b9c!-pr z@|JY57jozMvyz5CmAPl~y0HITvf<6ut~4Ye`&u=|`2>ubgz45A60OLu7J&m)Ji~?_ z^ow)Eo5L=J>;>V-qLShr-jWmxk2(4pR!Plc?KB&G?ulyprLDuZY9RH{LvZ7*{oGTIyDQy)Rk&O9;)}6+Uf7O4 z{H**@NtEipAY6bIi}Xg|`i?Pr>bTQj`Vgo8I`dAZY4T9;-eRK{v&*T38nBuq+*?Wf z7`%S;8^*N?%%&Lu>NGT_T}2=-YUgUHfUyWPQ&s5SP3@BkwfL7kEC3$-6Q}xx0&_u; zUGJd?)r2b!1Klc>x?k|>UDkzwk)57gO?d87H(@w0NDnz8gPHSBy01kWp{UM;Jdb2#K3XSrIK9J8xocR;9WqtUXnAxwjas@^qoQ6!y68hx zZ_W))37*Z`%vnyZVW0uG)pw}Yr=+w+b;>|%MRO`Hnru=`jzB$~YflIykK^&=ut?Q; zY_YI)(~2uEpCm$JW5{ey$-R|wL=^HI&z%8gtYYV!$DJR2(C~Rv2b%kC;zu`~(^AlG zLsh2M*et&Z?4d@5%ap<|KFavEjTIs3gt+KdJ-QtRyl4}XUJ4*0inG17f<=5zV9QL~ z(CSH>!hAI**hJCgS8mfnNAx$NVwj1EX_orWV&{alA(DHYiZvAn3>JtOjc%5DY>y><;`C7#4k3<+0upy+gJMHxs8-KMA!mGDTBjAxNZ1W) z@6b+Yq;szF?_SMph4*cytQB<64dz@59cgmSo^eBjVJ}qK#VMeRDF0r!IE*(^O#%<4($XBHH9tnwn!z0@DcFRPtT{s#0mQC^FKEPR8PH#L7Mb+On*P5pFRYP+jKkN*EkrSyL<<-9!-Q|*$GOupF}G- z#70NfZje2FT(Im~`%O9Y(9CBhPVoux&hs}u`+`0^gHGL4%r_pM?fFs+V5(B(4lwG- zcN;JJp1O(AV}qYIl#QZJ@(C*f105H3AjlVaou!TwitJ^3bH5wmX35YeYUsD?XwHha zxuqv6fNO9u4Q(WJihKjv={D1|e>nM};R8UKAAcB~Q)J6B*(Sr)+1n@gpu8y5;iyt8 zZdVtH-)pY7onE-%h%H&W(!<3sryfT4rl+M24J~qWv)uJuY1yzGqPg|kNgtpkK3D7i zj9w+KxY7eU+(~FEX^l~O2dA58=f8v+@JANO-u+}P#MZSmyaU|U{5AriV_xI!wdK34 z((H7*E_MNo*2Kd94EebY1P5#;!2eXM>QnfL{Q0>TA1S;#Dx#1QT*`Ke+!)(#jCljn zy<0}ziwyG-G$Wkqh3XGs`vHOVO!XDJ9A>XvF)f0Q<%wS_Y19k9e3czOIzX{oWPib) zU0gK(8_s_@@0^i&X)v(K=wbj;OBTr8ixcqx`~61t{r0zTvMTVGxkSO}^eMblwJ!cB zjSR6fwOUM=Fm6cuSgF7taqmC!rs0w0u&OCLvm0{Tb%TzK+a=eKG(9oGE_O)XOP}YU zx^K3^^ey6*Kua3WgpMi!OZe{wRX=Y>=eS(Zv+pY;gCmG5Y|5VyIx6NPstw(DdVC$; zTWEZ%^{_{R5hsUjHLja$c_RFM@zIWq6*3&ARD|*8o?SfaLahkP#BT0pP}QQ!pVFG| z7R4LT%l=*2``Iin9{wQ*wSvn{ei#8r1G9D?w>z@z(}S*O3wm$aRV$C#dRlaS0jp?TmHjh)Ee;z(C$%xqq_oR0!CXmp4!`+?m^^t>^YGyr6IGC6X1mQ8L4Ihk@Y)@mg zZ$O2t&%{fH=mR_ip)bso*J!7e;&1YE3dZ7KAZ6v~C%gDZ`f+SKic()*m@b_iBGniD zVEMf(K1%wjm%>x*crXV~*y8X8zm${PA!Vf7#6G;NjOV1X*ii)1m|2oDq4_qGtcS|+ zr;7^rSe}ZZQ7WdH+e8&CR07CDvR6XW@cR;SIiHRnOufI@;_xWDs-KAK5OK`7Vb}HyaFNYE8<~G>7GdsuXfp)ri@HGru~(oid<*Qi4Uga zRJ6Mu@cGVaYyHK~9@2 zt+a$C)a3ia<#kvb(-S2kLq2rleLZX!z!=VcV$Ok4(+dEOfUQ$6uu@@omEGHJZ>oEqqo9H@0;=06iDT-Jn!li};(hvo(UbaO4a465j;) z9zxxRc;7+5cSE!@;U7L!?I2u`C~bpzl!+Lk|ck9KDlTC z2JI`^(SGJT$}FXJZLRxVc&6;tXTF}`f>8!SaAO6bgr6x}aZgyn4jX4aMf-DVo>>qB zw!1lefgg;LF`7n}nCc_jIPO?cDrw~YVK~>TQ?4I`fO1nknA}sQS*&Jf% zkXBGd8KP$)Z5oUC$hI(7LZxfL z%j&_%>OsirA;{{1$?D0tnh`Ef97!W+oiZC04F-jOnD@4g#gIcyk*$71$4-S#+k57E zgFl&;68|=!qr3q%wE0b&u_j%g41M$oOKi4&I-kmLkz(=!s<5>vt7KvO z^zoU=kTAf-_MQi+FQ#mJW)0h8Y3=Vll2XPzn|Y}fb)vwx560Re#d=3S=2zQM`#VVF zS|)jzoP?+3&FxbzeVFAIdQ=3tT;(xk`j;U)2%}fx&@hg$BEtP%bQnWQjN(f z5L$-tmA>(45ufd~HW{g6=Lv!F4EOCrReIQ8jMRMN-e?qObXe;c%apW#A z9ivd*sdxzcAf%X9g8<9UdEDXEYhodt@gs!q{()TIDMbD>ict1;muC&0u^oHr7d>i? zz<#aGcn#;j_YL?qSHNQuHhEp{L2YhH(ZB+$xD*RTAWTmDF%|c|7f;%8tngo^#YMZi zpYu$^<|GnE2&1qSI??iifH=7u8V(96R+IZq9bK^VDAIH(gPvduCu=FWK7>|A&YcRCTk2ib5zqPs<1bq{VY3j~6jJu5 z00(c}juvnwUv9)SO%UVyQtNx#-xtd*SnmBj@of_qXV~`=RKP3=)8&SuPN*f9dLP_* z{P%U$1MD8R5Fhcsg@X1<4Xj}6>(a*wOVD_4DH>Ws`H>>l{Z!A-sVp#6!6nU7N2$lF z_HV4ZGaVs4AIA|)>MykNJp(WwugzyVyT|!lM9c-Mqp3?werQo{lJ>ZTzf~PluNat# z==>vm(rk=-0=(OC%eoJ{{d&9Wrr=uJgOi9UMz#h`N%qp*=wF3e53e{2IfOrMfnIc?r@LayCqDmS+lFTDFG!z&u2k??koi52_lm+Xx!ocyAh&r)=Ej3? zVpsV(tTaM*XwaoDa1>>NsM5cB$@~t`1!<->3Z~{zE!*}5AgVU74OuD6k!uQnC9tcA z$}+Lyhy>BWYKc` zc}}<)<@$?_w=ZaV27Q4!$(p9s8dy-Tze-l9XDX>y-z4S}Ya*)R%C{(Ql+)*$bU~VA zfkIH2bnlf-%SmDa_oLlD*twNbTmdvP81yPUoUzvkU!8=;g(u{vqji2P;QGKe^6&*_ z0M%a1`Rt2lAm5X4oY-DApb@L1%(RM63iDep*NRBN%`Eu^ns*7=KAFN0a$w)DKx@9KC*)dFIP*LBZ7yGMJD!LQXd>4);7u3(6Cv^^ z!ei2#R?3~UAFeZ|#jQC*|G;a{%DA>nx5W9{0o4U-At$dq{NHKd0-rbw1$W}?Ve0V@ zi0dpK9k+e$J)c^VP)jqntfT?9mvfcjRNI96r3?J`g>AS#4#meawN94hj66{a29hEB z7wzhT^n6B=uNx_TAzYyFJ;?_ii3z)y+k(`uSR_wKsiBFd5p%mI7W-MPTCEKUI`*#o@6E-Q6Qvl1-JT75eNTqEtZi-bA_@ zB*&SjwVbQ`?c#mu9c8gnckQ%D*tRQMppU%cmlewdozVnO=Db12S@OmzQ5D zN3K$_?kKp2MO9_NVyt+lbcAn7fk8*>TL0{bqm14xn)ejSxhWP067d*pU07XvO}%$p z%o0>UED!=58r{86na9rERZHGvBnv{Ve!WGeaB?JHP(c(FtI#ab6 z8p`CjRB1ct{QGu?!8LEqm4}rXcy;R?Lbz98H(WOObYRyFS%syP_JdwL+XpwujIpBb z$(2elg>3n=4&jFd34*@(hsc-KXA3zCK0p>|QhLx|N^nOh;%R%<3?o#_0t+`NL{O2HgkiQ+Xf3~ioJn$)uQisEe*qLK_^hoedxz# zb53!}epk#w2T2e;7&a{?4=_3((Fe*nUKnAuO#|hDWy2-fXSb(YEnW|GZ|%Lm^>_)! z%~5sbY>X%wr1Vc~$>)!FiYHsghLd->*$HhHQ|+zgO|yp;ZoVktW&Iig8q2;hI|iKx zAKyeFjtVA_&d&V~T!c0;d1=@b>td^phin7iZL?&(#5D4~vLd52lc0|AHI+!?F*CEX z3cL|JWz_?Yi_t3GQ2K|ud98h-1EvkDNB&0DSd&9VmUrFjuPPbL0R2|8{MEe%U%S;X zWRDj*RoP_k*}OgE@`4Id(AT=u0;Aq&P@ZPl!vsp4AFxaP3ql71%Suk+ORWt5n3x)FX#vRNZ)@Ws4U6TikGNFb^S z79IZSL3&Dl=EGF5~w}`|2Ip zo9&(4|6WmwM=cFzm1Rpa?Ao$#nZhHf*jtwYPpmn@A;q)mxU(B{EkR}3sM`Am{oj2X zpLVG-VE?Qh0{kaBZ#k~epCHMTUDaCEUZc5^d#`7hf*o#u@v#xibzLsNHi zR^EpZDGNAONTD4Vxf=WkqPQGLvxjI9h(-vI95Ams4eiyj;+voasH88;d z`j)G{idy6sSOJtE7#ODS&t3`9g+?Fzjqaz+?RX(0_dhaRwh%F7t(&4S#bUwLq!99j z)pR)u978KNo^o_4jddDqS*(k=!K{O<$)ZeIx>EzSS)>y&Qd`aT?zw6X9l!0= z)zfuH$EGU|-85mWsdSZd%<#s++KcoMGCuMZ({68}tg^ z#&ce}JmV;T)6>t`?KaUI;ZmY)5P6Q__?V3zav0i{?YU+ta|PmA4nC>0c_w&iZ)soBS&jHb|}*iyveO^ z488^G_>e|^WGH>7!~I|Ff##RKkQ4Sxp^D!kiZZa>ML9-pDIO8arlr0*J)S=0BRm_P9DsU1 z6YS7z{DL+z%d@Wc9{N}8DEu?K_+g8-H1U2UCL3n*QPK>_1od@_0gZO&dAW9Q>DY+g3|OM8~^elXkUpSRW){-3^tyM-qqBja8k}O zEr!(BxqDN}fpY=&H9zNp+aDIr*uYO>h|)wJYj7outerp4an`f_zTCI%%6h(0`thhA zbeTZ+FDwjS=zOaS+^zn5aQULkV7QAzXnDH>8Vb+6={|IhGkh;6r&fDK(eUx4N|O-zxR0Z#1A zz0ITB%8JrYDonrJh7MTWu0>0HxdC$8?iW)A5pt-^vcUKPpP71IOA6G`3KoiDKituP3x-fJ+x|RBiIlE zJ&#XGzu?I@nR1Ey-S$@YO--Q{uGqRq8hU&$j!X|S;&*zSfETt6ad8N{Jpq1~x0RfK z8)`;J6$5|2<`fX%^n2Z2*j9|h`vao?j=cUdwWOM(6pkk#;(e>QD;XVS%*Wwn|Cp`0 z@k)R2s7bP*nXkcnTh3anI4Pw@-Ybq_x`l=eOszXYb7hwH{yJw8Z@K0y^d3wAMjmTybYAT%F;jCS7zmUE_ z40O=0@6BK)_Ty0`hjRaQe{kY8@ksG=VVG^n*T=?!mC&;!rarEO|8Ti0%!Q1z_$D(E z;V^9wd@z3H9Qc+O+`#QY!5`v)A9#B8?{4DA@x{?pUCt9iL}l+mGVP+&CmncYJre09 zNSIpVzPC^Y{Qy%yn=w-V&$JiZ>a9XgpWuBeuXXb)27=$h5rjjtcd9y=s0SoS`nt1R^aw&z+}&jckpS-MHrTl4*n`gy`$I}DogHu4Oy zUNa0_rZ@r4INnSwBgWTENg%Np#9x{-NGmbK6;o1^o)<@|GU=TMRlV&5o${*qONL=y ztq8WB=>lrJj=zo=BfEDvedHl>&!c7@VJcqWqfy^H0HAz1-%#(x9Uxwn%QADs z(5W?*D~@Y`J$+nH4(6~1Hu%F-gv9U|0&SomnjEqTti%hOiY8Iw>DO}<_8#ns^8}_8 z0`b1TCJBwtBd8?BPx3fJm&lmKPMrrop21(K^Q141vIA1M(&K)E>R;TrYK=2FZr_2_ zJ*c;c28n?XGmY21)TipVNn`67WDkay+cvxxfCN_rD7lz|arBoV|E~%EfMbEc1A#!v zw25kr4!Mm6k#FSxT|Tt(HmTi!f`GJxgMbkJw|w}2I}XWN{!2W>CF?sbGGjy-dRnKH zX=i|Luf1$YK0;iL6z)9Y(KTWTpJ1^lrgBjt_Q8;#DK& zmVSvh`Nz**P@NFGUo^}bg7Ar%;!()0H}a(_8*7~+ER)y~dWP}L$@F3I`Z9S@tr=CG z=1+w}lSfn90Q9*s+xC4b|Crt)zeYvEDjJ5*@dhl>*RQcnJhBsB#Vh&5Rm>`wE$UH! zy38GAlL(XX@LuU3U}mu-*XP!dccFdSkt>|CIVWt;cTx5ECL*fSS6Uw~DOULH-d25V zvnw>^2C&ZT3}$ymo+qi9P_3}aRv}m#9==JZFCKaO(zLdv-SS~`r=P8J6{ZKj_IdL> zWYgoR>lI1m)!OUGwscMV693LFFzP332=mUSb3?nt#~RBgu5rSQ6*5kXeL-6{Pwssj z?~J%$$G^m?I}Td(Lw-VKt0>z24(16gLUP!n9L9Cf&wMx_Shx?D7W|fNYE(JZbndn? zK?J?V;N{q2z+)|6e8&IZGi7M&+tw8d1mp=G1O)THGey*24(&AR+|aiC~i}H4d8>mXRG`&rgr;(K9*aVX+eI$8Mb} zQ&p^{Tq6~)QEszN?9UCy9&kq%^Qj#{f#t*PN>vz+1I zC4S!NxAVWp4Lb1Rh@%`*8{!}@gkjZ;vmJ37Zp?^eqBr1(?GxfQUQZ8HLAkgnP))*U ziIn5mtwvD9H?SV5EHCA%{P zQ9<9_MDEqm&}ho0leH#)wkvNV!ONrOX0ryaKi71CL0H_roE;eXL|q)co%*$1N`8%A z7%DwsbNWYMz@JWHJ=g8Bcz;$mAUg8|zwHJ#o*kwrc+lGIASfmjuPAkFxe*aHs@Q#3RF;hVTH8&zS4!P|wvyO_aI4{G# zK-Rbt91Ul=!S=hvLf6q5@^vkuMNF%7PQxa@#TqzIAPJ{|U&zN0m1Kh3!o zC3ukuXi|PsoURIjdo`pUX^Lu*|RKG*v2 zZP}^o;IJ@!2I`#p8e(y+P4;SMvqZPXL6Xad_afSNom@f1c(T?JV=@)yv9e>RFS|9} zez2iat@}1`IB<4FUB^W)ML)3eRuGR~N@iRSQ!44Vg@)at9-K%9E9tB-BTpL1FOy&B zz2d@8^}Q1M<=Cgj9cS7V$5_)ebaTsXi};e@#tyue1fwUJxXZYUOx&^tXdE%mQi?et zCktA`*)b=f{5O!oH}S%geaETOUE5apxh6T>jGMr>)n*;bpDl{`0MmOP_;}TNb$qic zhY(>pcBB4}=^Rh};Zo(QDVJvxgO(oqoNKe;TfRlrJM@8lUl;XZx)AW)sfldyDXx){ z2G{|n5l%%F7{*)MOh+OzsY8K?k9;Zg{6kgPXa=tsMFx}Kisr1P`u_*Q-9$3LsU6NHer$C4Vb?K21c#<+uT&_$#8LuK7qrN1V% z3S9*&y9t#8q$U!i&crUUbktiMNvnV{WBtxB5;%W3-dIHAj~m0s8P2pWnTtkvtJ-Itb04Maw_z4$bjO zg$oD%>RrNPF!u?-pK!iY{mGnAav)Wet z$|$Q*DN;N{)+_xMZ2-v@dp;FU8J4R;~aBG68*fuM+ZQHi_#x^Rp@y51o+eyV{rD9u^N#E()GvBOUJwMOibM{*M zIgd7U4YIssxo|VN$ZDj-c{6Fx0A!u z>ILSO$Wyw|GEx&4jo+e8a$|2Rf{$hv`~1ZR17o|dzwZfC+?wrKYaBk=t85RpAjSTc zkeO$jH$l}rLcv3>lC3mHBecYaZp8=lt%f^-6b(~&GG>@ERx@R(^ZjDy*ofwe$=iqC z84UKs^LqjPe8I|cgab=D$T3F>`|~qS262cb%G5bZGt~t<(JLk@l9}2#h!7u$VZfd{ z*4`b0b_YwCyy~R0(~t8CF*~`*cU)&G;~xv?2<+~Tcez7>Z5&|bE(c)Dq|D_|QA- zoA{+z=J<#;75nLYv9)H40rM4wy7spR-f%FdXJny8tb=up#piu>>G5pqg?$m=@V>6W z@lA$>J<{@46^x0cP=biZ)1hM?Nd^X_FVigTG#B&0TUE0!xc}Tztg3C&m*3kd;TzM? z|M!;q4?H7k3oy5LCHpQ^FgLc71Gs!QG5j|<600;I1ICQ(2XJeuZE4MY`w_Gp?1O$w zW-}tv5H51PZcbHUqmtBoQs;F7^`d-W#vfrc!aZ%eGu>^x^FFqT*^i+>rUPnuv{7?+ z&_c!ury%(Ivb~%=!*P3WR>W-!`@QooY3)U`ojP3KxiUCGJeF@^gheTh` zdI2f?`#lCIa30g4I;@tv+-{-gGIE%HAWG59--}=viOA*wFtdhW(OG&|$0Z{y{?Qmt zZKO}KPw@YIZ%}Hg^Z4I1lIb^%g!A9;P2{_)Li~SJRhXGO|1S)vY3GQ3MDWF*wRL%< zHGTvwrNkry?L`a;D=tR`OH2**BT%eb43`5)uHD$?b9Dt_(m>ME+uZx8UZ7L6T#8X* zO{`{VZHW)Xn{ylec^2cI4Jcbg`c&#`mNWF9Yr<-G4BWSH&-?s(`g;1<&FvBV_q_cK zvK8f`KCe_zv>*iU6!9h#AfwQ;J`nl~hj?cMCut)&7 zhV$DbI8EU}g{(|Kj|eYvpRbR~^qx|4qcAqAjq`%6OhlE^UvNF1C#J5 zD*f97Qw)(HMvr--Wwpmcmr0DCfh84_Iba3kw54v41C56G`>K)fyw#73-Z~*33G5Fl-I?M)vE2a*_4K1ox%UXW3_A}A?@scf1q+|(S}-i6_0Kf(*bxUp zs(9_<5u=jLkN+~4=d|ID`;Mk23r*ko%_-)Ga^Mho#Mmp+!iy{-p=ohXRTb9gmNP!^ zSu)x1D1gRX;)^fn3>2II!L4O}0UBCBC01O<=mnWXH(k)QD3!P`Iy5j=4mk)2AbA=B z2hAf*@I_su_ByG;_0dGr7=!sO>?R+wM5hlWwrUR%!LsTz;^rnt)G}WA9v|0gPak}I zU~BuMO7HHdCC$#-pqI##?dfcGn!ou`;@RPMVD^RuTcvMev8)2 zmG@-!Xeg46=Ekj~LOAeo6?52`>PK>pvJQI2K3OC7iZKosm78Xj-qU(Vx2YW*Un!j( z0gN9jo&=A#?G#QLVjOP0Qv`-M7p2msYv>*~q%#X)i!xuQ1vW7C1ZVtEV3{?J)y!fH zJCs~`-&`iT(dNy~5;t{xS~wyo&Iv5sNo?<}3L2X1{({)3Cao>}rhD6`%d) z*Vf91EZw$bqlUrT6a!L^)XzYuQzsVgpYMPGl`+xk%R7z}XWP=20>wv{I)ZuTb$xmH zCit=SY!lC-4vlS_u9aDlxXyK*IP&BAv0s<$e!2_d^(qR6SM_>+LuU%DlZdqVk6|7e zy%|j+rGY*tO_F+P<%)o97j+!iEq8egj;=8$ZNt0ba(K!+6`Q!8L1~)JVLtrjCB0U0 zciZp`#y5I;$q7J5=TUTrQfUbJGtZ`O=YEH7I^N&jIocQPsDzPkL zL`1q--*kEB+sQ|{CMdyUAy1qk`7N%(si%Hi0w*{w1H{Z<#L;S#>LTU!A@}DGn80J1 zCS|jjtzGNRp*Re-2k#v%;(*74bmFzS!t_u-qqL%Sy-?dz0p4b89n!-_U?)B+bhXe} z7HD+sQULt@G~&`NUf|JcGb@25M4CZP>If!tQ7-AuUbP@3eQJ`S8i=Mp_N`RqANAP7 z?8DsyRp7@}lGM~>6Eb~`WkFl^P<9(Mz%%`sYk8cp+2Ou7AsyWxJRbB+x)R+pW=`GL zjjrT^uQo*0_m;pH=&@1pLUehiXQLx1#;3oyxuIN96TPgiVEm7|F`97aZ|=)OKh^4- zVz24c(ETCSR{_DX_eb!*=gs!skJZ-UD!sm!%{)P$P?mM zGb2@bK)K!X?tjDQyGKB){YR-OoD)k&TC4_VSi=l-4Va`W5?7otxkewAYI^aV5e*~Q zo)Vd>?7=H(W)BM80Gv(diLkzDv#zQbyHJyNKa|YD9W=Qouk2FRcLkHike1ZD_tX!v zTzlU5mDY#AU6XQB11!P#61Q9G7^;j{au!qq+T|W#=d)O6o1yS?rgSw8hPFf^9%-U@ zQ`ERZl~NAJY#)RW)Ml|NU;O3>^%k*0k!<&v!+iWay?}813%c%zVB&9@dim%gP2Cs* z9XNMuyR{O#L3=ySC#%nPNtb#>AMD@_Q?7h|FjXHI(T%M7X2HGuC!Epdxx__={u-$P z&5{O8=DX!Xm?s~-)>GH``_l<4$eUAY0l?WQKtO#DhlS0g;U5wHvNCPuGGmFq3uAtj zg}SM!sgF(96JvF8*mZ;QGE+YzHEsB8%ufUAK9tM59;EJIAuv%Lx#X#F1*!`bY^*5+ zru3GNpEms{)kEOH-hy*kMb=f1iKo$`wp|-(N{WL0NFBl*HQ2)tQP3Y!2rQ>=L=fbg z@+E}+_bl=2iCv5cb6%4x%$1%I?(wwm62-+I`wFl6`T;G+u$;qsXg{{C zmCCyJ8mP7kSq8b!CY#;jeDP^gNGY5&TABPt!ptve(aw-&K-rWl53BySuMV7l+vB?9c*kcp;GawFpiKawA56dcT_q6&7296JUZ|o{D{VKW z9ueHw`#I;sRpUDg=!U753xw4YH|F01lY!}h8~ZGa6FAFO305%MZ(ZAyg1((D{$F=jRX^VmP)69Rms(%O zq&HO7DI=dPvH4JsOrcC1tyxAqwQ6yD^F^yDkR~o3p?1nFi5rxn5+XMikHh1w0i*@< zY>9Ak!QCR+?=T@}ws|unQ0$v8)zylbf*8TqOI>41kw*N@np>G0s!vgy?^Vt&>agr~ zrMN+nrXtUk5hD)3U{LF$&5598*VJy;@gipG9UVniOqsmk{4Ipc@%Xqt5#zk(3`d*d z_vzlrnBBapDhd+BEi==CnK@6FzTjY)-7~M@?wP)F!wEK8TYqcC(c>vJvQ9NxCE9w#U0^fhik{!(5X!?QhkgBxMhJna zL*t?}XtrnkS|+tls#soVgtIy|`O5l!M2-$xizzNAFa3jQKaO>*BG=e7Ok5_@d^yEs zV?8e~z>OwVirW+xBN+2QD#2k51rU|!fT?k`%nF0BWkn3}R!Ej6b)nFfXt`nzX_^df z5bu1Q5X!$M`^OU1F0#kHGE_|RTJ1=?f7oAGd2|O@L6on-{%!%+wx=e2*f~lDmKXyGaOld>mvO%>VB?m`l z~srG=b;B)I-??jP9gnnzutn1lmGA)@VhxEpTW(+*i|@f_wQ zQfl%0PGCcrxk~r6bAq9kcDoBJ>(&R0F;#DlEINW*=u=|n4-1a~0%VF@)am))&aSv0 z39e(HTi2GU+EWPlm~zV+1e0Q>kLQD@flrPL@nyqAiI0w8nv75Nex7-xPT(<++}f^qQNsf%-)KK2~pr`+_%lDMkR%O5`PdrO@N6;QANFlFEhQuW|?HMWQ8- z$>F>ukI`Ygr5@9hg%QoG`$M)FS`krMVGgpES&bF#Pxq*SY}sG-eRuJmbhoer2b&pE z2w`3+Hg~qJ?+{)w$C$~-X(R*U>h#HZ3NVZjy!gx%Pl~%3g;>A zKmv;}lj40T5!8T8+fn)(Htd2^-bM;9P zJ#O22B!lYTgut}9XtFn!YAaED0bn#eOvT$k-4Ig^jlZfEn-7o{M)hx1^b!br4cigR z@^)6l1!t(+i<&;xnh*MOY13njnyw0IOLmGh7xzO_C2KjA1G@acXX%ovpaaW3WJ|*o zy>{V(iL!S&XU&LQhe{%thauh69~#lx)<3w$i9LIu6R{w2!J?ecyI_o!+si!(( zrGmnaI5c(cC_2)P&1Z(Hy(RWjLyhA%oSMk#qi%g8UugJ!0;^liV$bd*3r_`(aZSfN zv%Nj4P41?2v>hh0QXM|Y+TA&wlwG>W2^t5ub7^eBmyZQ@(p7T9!<{O3sbT2|M1$E( z%L?t?9_1fGP4)NH)Oxyda;JsZY8X(GwR;i)a=VUM2Z^-}Q>P1+6D|oZr?cVk&R)9; zJ3N1LJXm5`+-dCVeh!Sqd}vbA5U6mzFJ${rbn#C@6^GvbYpP9`kqP~UsiBdqk+$GB zYp%SFq0V8cU+R!nne9fPGI*}FYky#<`#T{p()@PVCuBFWL}7;vf-`s53Jd%YZuXy8 zFb*CZFcga~u}mS1l`kbe?FhRe9sW9=d=MqHN)J@Ye_{Zm=C6qjp!Vd>g>V+3HdV&h zF#S1J>;7L_wn*Sb1NR0I(!GH2QH^>);!}5dih#e)OXOYAUfLD;vtp*KRW5dLv~v&J zOm*uAOo#~tP4nbE1r&prm|S!yln?3t>mgM}pO)j0VH*V*4eS#=&gL3Un>C_EIt47$ zBD~rh!_1q>u}nM~B1$hebIMuMs#xln<&kzkV&)jg*?iv`l|Z5LWF}f9yyCa7Mev|l zeqX#wE*lTzn*K4Shf~ucAhpW2JY`Z>{`IFk=WQ!aWl|^tF>@$qRfQ!Y9m|n$ z=w|jNwKB}GGR3<^d#O4t} zDc@|6;%xUUS3SoOjCFShOB?KL?!{sy+p4o=?FgL8UNuVYWmC{w7VUO)yoPF)qK92c zXPOyspPyze5xdWY1{Get=KNv{J1LZJy2;;5A(!(HgvJodVAp>8ebFs{cX}t4tG~A1 zkggkvIHsQ?iL<`&*uc4`aqRl(t6k*qRl%PQF9yrPgJiygV`?OQ4ElX7TNgG{&O0f| zPiHv^1aA9@=)ozSBkct{9_$WVPs=Bvkzlml-ltW;olqnm*<7Ei4mpx~oeU^ddS*!A z+mCtRXG^!$;C2rikRSfFaBl&QC5X8D&n$l%6_#5_1GcI%$YWVL5u-2i`nU$alwf7q z8}uI>4%k0D0)CxMY8>FE9)BRX(KPyd;#AmUG|+%5*tD zUum7%l=|&i2QsTt&0|=0hjx#xU8`LUH`)rM z&TWf5QJFfylVeZ!38;sJFQ%C;MBVvly9kmvyjT75ZOk!S0j%GCkLl9zGb2ao@#N)0 z7+PVpze7s0J7Qew4lYXCF*FYq^n$^x`WLkV>*i;7OP7%5r#Ic;{NvRRMsPFYG&&-l z196+DQcn_&*7_Iz@gPKJoxHhe(eO9sFsWgfVtUq`1xQjeHL{EU2m!H6A-KZ?1(eby zo*zMq6h-R&(w+FhKSs8_gffpxZ=>GGuoP z9~>VdDxpJg_4dJw``Yhocb&Y~JbZF2Kb7nRZIRbgbzYf5N*S({mD_} zi&hjsWWA{{_5@Sp@WjA?=qY-EAKLc7SM(qnV1>6Py|LY9<}-|_v5kW?z_;m3u_GFr z+7>pXKip=GVgw0Hmb^Ja@l{_RV;vAMmLt^?X&x0>i;2i-$NaQ1#Sgvx=|i;ewEoA| zaay2N*3Gu#Nx9~Djb^E+i+nU#VTb}}Nea=pWjNKZebQN43N>u&M5Spl*(AO(CoqUw zo()s2V0(|nB5CsD0%j>k3?}g55eEN;K3t4#skf$}^ylB88N3G`y|ZP#vl-`#)gu*- zQQ>lQ8~aaQ^NV~10xBz-yEB+f%B8JyAkI-3oaInx z(`slFr)hTI|SsMcghZ6z*ph^X8pi_A4A_ zE1rc*Fb?7ceBv4z<_hIIET|Q&n1o0;q{|eu?HQyaAkLpxT1vTgk1ilP?Uy`9lkC0J$B{$+Uj>&{VA@b{0S zBY`mX$JcgyvGBA3em35avi%0MkrMH;#M%A24|q+sjA5}P(kA(cdDZl>Vu0PB2mKEah>V2?=dm}?* zx85F)(Ed6aPb;J^;=21$(My}8p80QuC?DsO+=?o#ikgn|A4Tvp^P|@OGB4}-@o;Q+ zO~H9nHlSY|LA&+@qhXo-*EuU^nf(F0HKUpRUp(}apT7b0>8hCC;7vB5Wqf&}!XEqC zMKAY%i&RcxFqfxsP)yHrAXt1m`z*vh!pBfYWhl(|qKCJD*t~TK&DfWosaCHn)OWNI z`|PE`bq9#P2p)&$?MS;u)xObMeh_nqyrzWh@YiYljX$TTJ$iNZRY-NTlofslHsW575oG8 z8ugQaBd66Ou+>lXkfF+s<8E`-65kzI^_n#N^HW)YCsF6&B$jVx*or3T*S|z2+cmJxn|+ zzlg7PAg=yqPA*LW$Q<@nmwA-UHmpl0#7SA6fBtP?S8TIrbc3;34W=?aSJ5BA%{BIf z&BF~2R=xX*3H##S?3+K%+CTBo*NzguJmqr>FuRV_b8fvrnr>FYe^eZO;6f+`?? zmJXIQue44r?xumuuG`C_fXiMPVqd3I_epv7%Ts;*3SFN_7UY$uYgKFcs#FbS-IU77 z^3_{{m|AYTM~qm>G4{8N}JWawL1L3_w6=cSMj%0Dh< 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 J5d7BB{{Ui+ihKY7 literal 0 HcmV?d00001 diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/pom.xml b/plugins/burp-suite/cyberstrikeai-burp-extension/pom.xml new file mode 100644 index 00000000..d54d5264 --- /dev/null +++ b/plugins/burp-suite/cyberstrikeai-burp-extension/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + ai.cyberstrike + cyberstrikeai-burp-extension + 1.0.0 + CyberStrikeAI Burp Suite Extension + + + 11 + UTF-8 + + + + + + net.portswigger.burp.extender + burp-extender-api + 2.3 + provided + + + + + + + org.apache.maven.plugins + maven-jar-plugin + 3.4.2 + + + + burp.BurpExtender + + + + + + + + diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/settings.gradle b/plugins/burp-suite/cyberstrikeai-burp-extension/settings.gradle new file mode 100644 index 00000000..6a56ea57 --- /dev/null +++ b/plugins/burp-suite/cyberstrikeai-burp-extension/settings.gradle @@ -0,0 +1,2 @@ +rootProject.name = "cyberstrikeai-burp-extension" + diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/BurpExtender.java b/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/BurpExtender.java new file mode 100644 index 00000000..7ef116e6 --- /dev/null +++ b/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/BurpExtender.java @@ -0,0 +1,138 @@ +package burp; + +import javax.swing.*; +import java.util.ArrayList; +import java.util.List; + +public class BurpExtender implements IBurpExtender, IContextMenuFactory { + private IBurpExtenderCallbacks callbacks; + private IExtensionHelpers helpers; + + private CyberStrikeAITab tab; + private final CyberStrikeAIClient client = new CyberStrikeAIClient(); + + @Override + public void registerExtenderCallbacks(IBurpExtenderCallbacks callbacks) { + this.callbacks = callbacks; + this.helpers = callbacks.getHelpers(); + + callbacks.setExtensionName("CyberStrikeAI Extension"); + + this.tab = new CyberStrikeAITab(); + callbacks.addSuiteTab(tab); + + callbacks.registerContextMenuFactory(this); + + callbacks.printOutput("CyberStrikeAI extension loaded."); + } + + @Override + public List createMenuItems(IContextMenuInvocation invocation) { + List items = new ArrayList<>(); + + JMenuItem sendItem = new JMenuItem("Send to CyberStrikeAI (stream test)"); + sendItem.addActionListener(e -> { + IHttpRequestResponse[] selected = invocation.getSelectedMessages(); + if (selected == null || selected.length == 0) { + return; + } + + CyberStrikeAIClient.Config cfg = tab.currentConfig(); + String token = tab.getToken(); + if (token == null || token.trim().isEmpty()) { + JOptionPane.showMessageDialog(tab.getUiComponent(), + "Please click Validate first to obtain a token.", + "CyberStrikeAI", JOptionPane.WARNING_MESSAGE); + return; + } + + String prompt = HttpMessageFormatter.toPrompt(helpers, selected[0]); + String title = HttpMessageFormatter.getRequestTitle(helpers, selected[0]); + String agentModeStr = (cfg.agentMode == CyberStrikeAIClient.AgentMode.MULTI) ? "Multi Agent" : "Single Agent"; + String runId = tab.startNewRun(title, agentModeStr, selected[0]); + tab.appendProgressToRun(runId, "\n[server] " + cfg.baseUrl + "\n\n"); + + client.streamTest(cfg, token, prompt, new CyberStrikeAIClient.StreamListener() { + @Override + public void onEvent(String type, String message, String rawJson) { + if (type == null) type = ""; + switch (type) { + case "response_delta": + case "eino_agent_reply_stream_delta": + // delta chunk (content only) + tab.appendFinalToRun(runId, message); + break; + case "response": + // final response (full) + tab.appendFinalToRun(runId, "\n\n--- Final Response ---\n"); + tab.appendFinalToRun(runId, message); + tab.setFinalResponse(runId, message); + break; + case "progress": + tab.appendProgressToRun(runId, "\n[progress] " + message + "\n"); + tab.setRunStatus(runId, "running"); + break; + case "cancelled": + tab.appendProgressToRun(runId, "\n[cancelled] " + message + "\n"); + tab.setRunStatus(runId, "cancelled"); + break; + case "error": + tab.appendProgressToRun(runId, "\n[error] " + message + "\n"); + tab.setRunStatus(runId, "error"); + break; + case "thinking_stream_start": + case "thinking_stream_delta": + case "tool_call": + case "tool_result": + case "tool_result_delta": + // debug; hide by default + if (tab.isShowDebugEvents() && message != null && !message.isEmpty()) { + tab.appendProgressToRun(runId, "\n[" + type + "] " + message + "\n"); + } + break; + case "conversation": + // Capture conversationId for stop/cancel. + if (rawJson != null) { + String convId = SimpleJson.extractStringField(rawJson, "conversationId"); + if (convId != null && !convId.trim().isEmpty()) { + tab.setRunConversationId(runId, convId); + } + } + if (tab.isShowDebugEvents() && message != null && !message.isEmpty()) { + tab.appendProgressToRun(runId, "\n[" + type + "] " + message + "\n"); + } + break; + case "done": + // handled in onDone too + break; + default: + if (tab.isShowDebugEvents() && message != null && !message.isEmpty()) { + tab.appendProgressToRun(runId, "\n[" + type + "] " + message + "\n"); + } + break; + } + } + + @Override + public void onError(String message, Exception e) { + tab.appendProgressToRun(runId, "\n[error] " + message + "\n"); + tab.setRunStatus(runId, "error"); + callbacks.printError("CyberStrikeAI stream error: " + message); + if (e != null) { + callbacks.printError(e.toString()); + } + } + + @Override + public void onDone() { + tab.appendProgressToRun(runId, "\n\n[done]\n"); + tab.setRunStatus(runId, "done"); + } + }); + }); + + items.add(sendItem); + return items; + } +} + diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/CyberStrikeAIClient.java b/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/CyberStrikeAIClient.java new file mode 100644 index 00000000..c7713f58 --- /dev/null +++ b/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/CyberStrikeAIClient.java @@ -0,0 +1,234 @@ +package burp; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.HashMap; +import java.util.Map; + +final class CyberStrikeAIClient { + + static final class Config { + final String baseUrl; // e.g. http://127.0.0.1:8080 + final String password; + final AgentMode agentMode; + + Config(String baseUrl, String password, AgentMode agentMode) { + this.baseUrl = baseUrl; + this.password = password; + this.agentMode = agentMode; + } + } + + enum AgentMode { + SINGLE, + MULTI + } + + interface StreamListener { + void onEvent(String type, String message, String rawJson); + void onError(String message, Exception e); + void onDone(); + } + + String loginAndValidate(Config cfg) throws IOException { + String token = login(cfg.baseUrl, cfg.password); + validate(cfg.baseUrl, token); + return token; + } + + private String login(String baseUrl, String password) throws IOException { + URL url = new URL(baseUrl + "/api/auth/login"); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("POST"); + conn.setDoOutput(true); + conn.setRequestProperty("Content-Type", "application/json"); + conn.setRequestProperty("Accept", "application/json"); + String body = "{\"password\":\"" + escapeJson(password) + "\"}"; + try (OutputStream os = conn.getOutputStream()) { + os.write(body.getBytes(StandardCharsets.UTF_8)); + } + int code = conn.getResponseCode(); + String contentType = conn.getHeaderField("Content-Type"); + String resp = readAll(code >= 200 && code < 300 ? conn.getInputStream() : conn.getErrorStream()); + + // Friendly diagnosis: HTML usually means wrong host/port (e.g., hit Burp UI/proxy page). + if (looksLikeHtml(resp) || (contentType != null && contentType.toLowerCase().contains("text/html"))) { + throw new IOException("Login failed: server returned HTML, not API JSON. Check IP/Port and ensure you point to CyberStrikeAI backend."); + } + + String serverError = SimpleJson.extractStringField(resp, "error"); + if (code < 200 || code >= 300) { + if (!serverError.isEmpty()) { + throw new IOException("Login failed (" + code + "): " + serverError); + } + throw new IOException("Login failed (" + code + ")."); + } + + if (!serverError.isEmpty()) { + throw new IOException("Login failed: " + serverError); + } + + String token = SimpleJson.extractStringField(resp, "token"); + if (token.isEmpty()) { + throw new IOException("Login response missing token. Check backend address and credentials."); + } + return token; + } + + private void validate(String baseUrl, String token) throws IOException { + URL url = new URL(baseUrl + "/api/auth/validate"); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("GET"); + conn.setRequestProperty("Authorization", "Bearer " + token); + int code = conn.getResponseCode(); + String resp = readAll(code >= 200 && code < 300 ? conn.getInputStream() : conn.getErrorStream()); + if (code < 200 || code >= 300) { + throw new IOException("Validate failed (" + code + "): " + resp); + } + } + + void streamTest(Config cfg, String token, String message, StreamListener listener) { + String path = (cfg.agentMode == AgentMode.MULTI) ? "/api/multi-agent/stream" : "/api/agent-loop/stream"; + String urlStr = cfg.baseUrl + path; + + Map payload = new HashMap<>(); + payload.put("message", message); + payload.put("conversationId", ""); + payload.put("role", ""); + + new Thread(() -> { + HttpURLConnection conn = null; + try { + URL url = new URL(urlStr); + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("POST"); + conn.setDoOutput(true); + conn.setRequestProperty("Content-Type", "application/json"); + conn.setRequestProperty("Accept", "text/event-stream"); + conn.setRequestProperty("Authorization", "Bearer " + token); + + String body = toJson(payload); + try (OutputStream os = conn.getOutputStream()) { + os.write(body.getBytes(StandardCharsets.UTF_8)); + } + + int code = conn.getResponseCode(); + InputStream is = (code >= 200 && code < 300) ? conn.getInputStream() : conn.getErrorStream(); + if (is == null) { + throw new IOException("No response body (HTTP " + code + ")"); + } + + try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { + String line; + while ((line = br.readLine()) != null) { + // SSE format: "data: {json}" + if (line.startsWith("data:")) { + String json = line.substring("data:".length()).trim(); + if (!json.isEmpty()) { + String type = SimpleJson.extractStringField(json, "type"); + String msg = SimpleJson.extractStringField(json, "message"); + listener.onEvent(type, msg, json); + if ("done".equals(type)) { + break; + } + } + } + } + } + listener.onDone(); + } catch (Exception e) { + listener.onError(e.getMessage(), e); + } finally { + if (conn != null) { + conn.disconnect(); + } + } + }, "CyberStrikeAI-Stream").start(); + } + + void cancelByConversationId(String baseUrl, String token, String conversationId) throws IOException { + if (conversationId == null || conversationId.trim().isEmpty()) { + throw new IOException("Missing conversationId."); + } + URL url = new URL(baseUrl + "/api/agent-loop/cancel"); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("POST"); + conn.setDoOutput(true); + conn.setRequestProperty("Content-Type", "application/json"); + conn.setRequestProperty("Accept", "application/json"); + conn.setRequestProperty("Authorization", "Bearer " + token); + + String body = "{\"conversationId\":\"" + escapeJson(conversationId.trim()) + "\"}"; + try (OutputStream os = conn.getOutputStream()) { + os.write(body.getBytes(StandardCharsets.UTF_8)); + } + + int code = conn.getResponseCode(); + String resp = readAll(code >= 200 && code < 300 ? conn.getInputStream() : conn.getErrorStream()); + if (code < 200 || code >= 300) { + String serverError = SimpleJson.extractStringField(resp, "error"); + if (!serverError.isEmpty()) { + throw new IOException("Cancel failed (" + code + "): " + serverError); + } + throw new IOException("Cancel failed (" + code + ")."); + } + } + + private static String toJson(Map payload) { + String message = payload.get("message") != null ? String.valueOf(payload.get("message")) : ""; + String conversationId = payload.get("conversationId") != null ? String.valueOf(payload.get("conversationId")) : ""; + String role = payload.get("role") != null ? String.valueOf(payload.get("role")) : ""; + return "{" + + "\"message\":\"" + escapeJson(message) + "\"," + + "\"conversationId\":\"" + escapeJson(conversationId) + "\"," + + "\"role\":\"" + escapeJson(role) + "\"" + + "}"; + } + + private static String escapeJson(String s) { + if (s == null) return ""; + StringBuilder sb = new StringBuilder(s.length() + 16); + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + switch (c) { + case '\\': sb.append("\\\\"); break; + case '"': sb.append("\\\""); break; + case '\n': sb.append("\\n"); break; + case '\r': sb.append("\\r"); break; + case '\t': sb.append("\\t"); break; + default: + if (c < 0x20) { + sb.append(String.format("\\u%04x", (int) c)); + } else { + sb.append(c); + } + } + } + return sb.toString(); + } + + private static String readAll(InputStream is) throws IOException { + if (is == null) return ""; + try (BufferedReader br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8))) { + StringBuilder sb = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) { + sb.append(line).append('\n'); + } + return sb.toString().trim(); + } + } + + private static boolean looksLikeHtml(String s) { + if (s == null) return false; + String t = s.trim().toLowerCase(); + return t.startsWith("") || t.contains(" agentModeBox = new JComboBox<>(new String[]{"Single Agent", "Multi Agent"}); + private final JButton validateButton = new JButton("Validate"); + private final JButton clearButton = new JButton("Clear Output"); + private final JButton stopButton = new JButton("Stop"); + private final JButton copyButton = new JButton("Copy"); + private final JButton clearAllButton = new JButton("Clear All"); + private final JLabel statusLabel = new JLabel("Not validated"); + private final JCheckBox showDebugEventsBox = new JCheckBox("Show debug events", false); + private final JCheckBox renderMarkdownBox = new JCheckBox("Render Markdown", true); + + private final JTextArea progressArea = new JTextArea(); + private final JTextArea finalRawArea = new JTextArea(); // raw final stream / final response + private final JEditorPane markdownPane = new JEditorPane("text/html", ""); + private final CardLayout outputCardsLayout = new CardLayout(); + private final JPanel outputCards = new JPanel(outputCardsLayout); + private final JPanel outputRoot = new JPanel(new BorderLayout()); + private final JPanel progressContainer = new JPanel(new CardLayout()); + private final JToggleButton progressToggle = new JToggleButton("Progress ▾", true); + private final JTextArea requestArea = new JTextArea(); + private final JTextArea responseArea = new JTextArea(); + private final JTabbedPane rightTabs = new JTabbedPane(); + + private final CyberStrikeAIClient client = new CyberStrikeAIClient(); + private final AtomicReference tokenRef = new AtomicReference<>(""); + + private final DefaultListModel testListModel = new DefaultListModel<>(); + private final JList testList = new JList<>(testListModel); + private final DefaultListModel filteredListModel = new DefaultListModel<>(); + private final JList filteredList = new JList<>(filteredListModel); + private final JTextField searchField = new JTextField(); + private final Map runs = new HashMap<>(); + private final Map runIdToIndex = new HashMap<>(); + private final AtomicInteger runSeq = new AtomicInteger(1); + private String selectedRunId = null; + + private static final class TestRun { + final String id; + final String title; + final String agentMode; + final StringBuilder buffer = new StringBuilder(); + final StringBuilder progressBuffer = new StringBuilder(); + final StringBuilder finalBuffer = new StringBuilder(); + String status; + String conversationId; + String requestRaw; + String responseRaw; + String finalResponse; + + TestRun(String id, String title, String agentMode) { + this.id = id; + this.title = title; + this.agentMode = agentMode; + this.status = "running"; + this.conversationId = ""; + this.requestRaw = ""; + this.responseRaw = ""; + this.finalResponse = ""; + } + + @Override + public String toString() { + return id; + } + } + + CyberStrikeAITab() { + root.add(buildConfigPanel(), BorderLayout.NORTH); + root.add(buildMainPane(), BorderLayout.CENTER); + wireActions(); + } + + private JComponent buildConfigPanel() { + // Best-practice toolbar layout: + // Row 1 = connection settings + // Row 2 = run controls + view options + JPanel rootPanel = new JPanel(); + rootPanel.setLayout(new BoxLayout(rootPanel, BoxLayout.Y_AXIS)); + rootPanel.setBorder(BorderFactory.createEmptyBorder(4, 6, 4, 6)); + + hostField.setColumns(14); + portField.setColumns(6); + passwordField.setColumns(12); + agentModeBox.setPreferredSize(new Dimension(160, agentModeBox.getPreferredSize().height)); + + JPanel row1 = new JPanel(new FlowLayout(FlowLayout.LEFT, 8, 2)); + row1.add(new JLabel("Host")); + row1.add(hostField); + row1.add(new JLabel("Port")); + row1.add(portField); + row1.add(new JLabel("Password")); + row1.add(passwordField); + row1.add(validateButton); + row1.add(statusLabel); + + JPanel row2 = new JPanel(new FlowLayout(FlowLayout.LEFT, 8, 2)); + row2.add(new JLabel("Agent")); + row2.add(agentModeBox); + row2.add(stopButton); + row2.add(copyButton); + row2.add(clearButton); + row2.add(showDebugEventsBox); + row2.add(renderMarkdownBox); + + rootPanel.add(row1); + rootPanel.add(row2); + return rootPanel; + } + + private JComponent buildMainPane() { + JPanel sidebarPanel = buildSidebarPanel(); + JComponent right = buildRightPanel(); + + JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, sidebarPanel, right); + split.setResizeWeight(0.25); + split.setBorder(null); + return split; + } + + private JPanel buildSidebarPanel() { + JPanel p = new JPanel(new BorderLayout()); + filteredList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + + filteredList.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 12)); + filteredList.setCellRenderer(new TestRunCellRenderer()); + filteredList.addListSelectionListener(e -> { + if (!e.getValueIsAdjusting()) { + String id = getSelectedRunIdFromList(); + if (id != null) { + setLogAreaToRun(id); + } + } + }); + + JLabel title = new JLabel("Test History"); + title.setBorder(BorderFactory.createEmptyBorder(6, 8, 6, 8)); + + JPanel top = new JPanel(new BorderLayout(8, 6)); + top.setBorder(BorderFactory.createEmptyBorder(0, 8, 0, 8)); + top.add(title, BorderLayout.NORTH); + searchField.setToolTipText("Search runs (title)"); + top.add(searchField, BorderLayout.SOUTH); + + JScrollPane sp = new JScrollPane(filteredList); + sp.setBorder(BorderFactory.createTitledBorder("Runs")); + + clearAllButton.addActionListener(e -> clearAllRuns()); + JPanel bottom = new JPanel(new FlowLayout(FlowLayout.LEFT, 8, 6)); + bottom.add(clearAllButton); + + p.add(top, BorderLayout.NORTH); + p.add(sp, BorderLayout.CENTER); + p.add(bottom, BorderLayout.SOUTH); + p.setPreferredSize(new Dimension(320, 200)); + return p; + } + + private JComponent buildRightPanel() { + configureTextArea(progressArea, true); + configureTextArea(finalRawArea, true); + markdownPane.setEditable(false); + markdownPane.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE); + markdownPane.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 12)); + markdownPane.setOpaque(true); + markdownPane.setBackground(Color.WHITE); + + configureTextArea(requestArea, false); + configureTextArea(responseArea, false); + + outputCards.add(new JScrollPane(finalRawArea), "raw"); + outputCards.add(new JScrollPane(markdownPane), "md"); + + outputRoot.add(buildOutputHeader(), BorderLayout.NORTH); + outputRoot.add(buildOutputBody(), BorderLayout.CENTER); + + rightTabs.addTab("Output", outputRoot); + rightTabs.addTab("Request", new JScrollPane(requestArea)); + rightTabs.addTab("Response", new JScrollPane(responseArea)); + return rightTabs; + } + + private JComponent buildOutputHeader() { + JPanel header = new JPanel(new BorderLayout(8, 0)); + header.setBorder(BorderFactory.createEmptyBorder(6, 8, 6, 8)); + + JPanel left = new JPanel(new FlowLayout(FlowLayout.LEFT, 8, 0)); + left.add(progressToggle); + header.add(left, BorderLayout.WEST); + + return header; + } + + private JComponent buildOutputBody() { + JScrollPane progressScroll = new JScrollPane(progressArea); + progressScroll.setBorder(BorderFactory.createTitledBorder("Progress")); + progressScroll.getVerticalScrollBar().setUnitIncrement(16); + + JPanel empty = new JPanel(); + progressContainer.add(progressScroll, "show"); + progressContainer.add(empty, "hide"); + ((CardLayout) progressContainer.getLayout()).show(progressContainer, "show"); + + JPanel finalPanel = new JPanel(new BorderLayout()); + finalPanel.add(outputCards, BorderLayout.CENTER); + finalPanel.setBorder(BorderFactory.createTitledBorder("Final Response")); + + JSplitPane split = new JSplitPane(JSplitPane.VERTICAL_SPLIT, progressContainer, finalPanel); + split.setResizeWeight(0.15); + split.setBorder(null); + split.setDividerSize(6); + + final int[] lastDividerLocation = new int[]{140}; // sensible default + + progressToggle.addActionListener(e -> { + boolean show = progressToggle.isSelected(); + progressToggle.setText(show ? "Progress ▾" : "Progress ▸"); + CardLayout cl = (CardLayout) progressContainer.getLayout(); + cl.show(progressContainer, show ? "show" : "hide"); + if (!show) { + int current = split.getDividerLocation(); + if (current > 0) { + lastDividerLocation[0] = current; + } + split.setDividerLocation(0); + split.setDividerSize(0); + } else { + split.setDividerSize(6); + // Restore previous divider location (or fallback to 20% of height) + int restore = lastDividerLocation[0]; + if (restore <= 0) { + int h = split.getHeight(); + restore = (h > 0) ? Math.max(80, (int) (h * 0.2)) : 140; + } + split.setDividerLocation(restore); + } + split.revalidate(); + split.repaint(); + }); + + return split; + } + + private static void configureTextArea(JTextArea area, boolean monospaced) { + area.setEditable(false); + area.setLineWrap(false); + area.setWrapStyleWord(false); + if (monospaced) { + area.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12)); + } else { + area.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12)); + } + } + + private static Color colorForStatus(String status) { + if (status == null) return new Color(120, 120, 120); + switch (status) { + case "running": + return new Color(33, 150, 243); + case "done": + return new Color(76, 175, 80); + case "error": + return new Color(244, 67, 54); + case "cancelled": + case "cancelling": + return new Color(255, 152, 0); + default: + return new Color(120, 120, 120); + } + } + + private static final class DotIcon implements Icon { + private final int size; + private Color color; + + DotIcon(int size, Color color) { + this.size = size; + this.color = color; + } + + void setColor(Color color) { + this.color = color; + } + + @Override + public int getIconWidth() { + return size; + } + + @Override + public int getIconHeight() { + return size; + } + + @Override + public void paintIcon(Component c, Graphics g, int x, int y) { + Graphics2D g2 = (Graphics2D) g.create(); + try { + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setColor(color != null ? color : Color.GRAY); + g2.fillOval(x, y, size, size); + } finally { + g2.dispose(); + } + } + } + + private static final class TestRunCellRenderer implements ListCellRenderer { + private final JPanel panel = new JPanel(new BorderLayout(8, 0)); + private final JLabel dotLabel = new JLabel(); + private final JLabel titleLabel = new JLabel(); + private final JLabel metaLabel = new JLabel(); + private final JPanel textPanel = new JPanel(); + private final DotIcon dotIcon = new DotIcon(10, new Color(120, 120, 120)); + + TestRunCellRenderer() { + panel.setBorder(BorderFactory.createEmptyBorder(6, 8, 6, 8)); + dotLabel.setIcon(dotIcon); + + textPanel.setLayout(new BoxLayout(textPanel, BoxLayout.Y_AXIS)); + titleLabel.setFont(titleLabel.getFont().deriveFont(Font.BOLD)); + metaLabel.setFont(metaLabel.getFont().deriveFont(Font.PLAIN, 11f)); + metaLabel.setForeground(new Color(102, 102, 102)); + textPanel.add(titleLabel); + textPanel.add(metaLabel); + + panel.add(dotLabel, BorderLayout.WEST); + panel.add(textPanel, BorderLayout.CENTER); + panel.setOpaque(true); + textPanel.setOpaque(false); + } + + @Override + public Component getListCellRendererComponent(JList list, TestRun value, int index, boolean isSelected, boolean cellHasFocus) { + String titleText = value != null ? value.title : ""; + String modeText = value != null ? value.agentMode : ""; + String statusText = value != null ? value.status : ""; + + String shownTitle = titleText; + if (shownTitle.length() > 80) { + shownTitle = shownTitle.substring(0, 77) + "..."; + } + titleLabel.setText(shownTitle); + metaLabel.setText(modeText + " · " + statusText); + + dotIcon.setColor(colorForStatus(statusText)); + + if (isSelected) { + panel.setBackground(list.getSelectionBackground()); + titleLabel.setForeground(list.getSelectionForeground()); + metaLabel.setForeground(list.getSelectionForeground()); + } else { + panel.setBackground(list.getBackground()); + titleLabel.setForeground(list.getForeground()); + metaLabel.setForeground(new Color(102, 102, 102)); + } + + return panel; + } + } + + // right panel builds scroll panes for each tab + + private void wireActions() { + validateButton.addActionListener(e -> { + validateButton.setEnabled(false); + statusLabel.setText("Validating..."); + log("Validating connection..."); + new Thread(() -> { + try { + CyberStrikeAIClient.Config cfg = currentConfig(); + String token = client.loginAndValidate(cfg); + tokenRef.set(token); + SwingUtilities.invokeLater(() -> statusLabel.setText("OK (token saved)")); + log("Validation OK."); + } catch (Exception ex) { + tokenRef.set(""); + SwingUtilities.invokeLater(() -> statusLabel.setText("Failed: " + ex.getMessage())); + log("Validation failed: " + ex.getMessage()); + } finally { + SwingUtilities.invokeLater(() -> validateButton.setEnabled(true)); + } + }, "CyberStrikeAI-Validate").start(); + }); + + clearButton.addActionListener(e -> { + if (selectedRunId == null) { + progressArea.setText(""); + finalRawArea.setText(""); + markdownPane.setText(""); + return; + } + TestRun run = runs.get(selectedRunId); + if (run == null) return; + synchronized (run) { + run.buffer.setLength(0); + run.progressBuffer.setLength(0); + run.finalBuffer.setLength(0); + } + progressArea.setText(""); + finalRawArea.setText(""); + markdownPane.setText(""); + }); + + copyButton.addActionListener(e -> { + String text; + int idx = rightTabs.getSelectedIndex(); + String tabName = idx >= 0 ? rightTabs.getTitleAt(idx) : ""; + if ("Request".equals(tabName)) { + text = requestArea.getText(); + } else if ("Response".equals(tabName)) { + text = responseArea.getText(); + } else { + text = finalRawArea.getText(); + } + Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(text == null ? "" : text), null); + }); + + stopButton.addActionListener(e -> { + String runId = selectedRunId; + if (runId == null) return; + TestRun run = runs.get(runId); + if (run == null) return; + String token = getToken(); + if (token == null || token.trim().isEmpty()) { + appendToRun(runId, "\n[error] Not validated.\n"); + return; + } + String convId; + synchronized (run) { + convId = run.conversationId; + } + if (convId == null || convId.trim().isEmpty()) { + appendToRun(runId, "\n[info] conversationId not available yet (wait for server to create session).\n"); + return; + } + + stopButton.setEnabled(false); + new Thread(() -> { + try { + CyberStrikeAIClient.Config cfg = currentConfig(); + client.cancelByConversationId(cfg.baseUrl, token, convId); + appendToRun(runId, "\n[info] Cancel requested.\n"); + setRunStatus(runId, "cancelling"); + } catch (Exception ex) { + appendToRun(runId, "\n[error] Cancel failed: " + ex.getMessage() + "\n"); + } finally { + SwingUtilities.invokeLater(() -> stopButton.setEnabled(true)); + } + }, "CyberStrikeAI-Cancel").start(); + }); + + searchField.getDocument().addDocumentListener(new javax.swing.event.DocumentListener() { + @Override public void insertUpdate(javax.swing.event.DocumentEvent e) { applyFilter(); } + @Override public void removeUpdate(javax.swing.event.DocumentEvent e) { applyFilter(); } + @Override public void changedUpdate(javax.swing.event.DocumentEvent e) { applyFilter(); } + }); + + renderMarkdownBox.addActionListener(e -> refreshOutputView()); + } + + CyberStrikeAIClient.Config currentConfig() { + String host = hostField.getText().trim(); + String port = portField.getText().trim(); + String password = new String(passwordField.getPassword()); + String baseUrl = "http://" + host + ":" + port; + CyberStrikeAIClient.AgentMode mode = agentModeBox.getSelectedIndex() == 1 + ? CyberStrikeAIClient.AgentMode.MULTI + : CyberStrikeAIClient.AgentMode.SINGLE; + return new CyberStrikeAIClient.Config(baseUrl, password, mode); + } + + String getToken() { + return tokenRef.get(); + } + + boolean isShowDebugEvents() { + return showDebugEventsBox.isSelected(); + } + + private String nextRunId() { + return "run_" + runSeq.getAndIncrement(); + } + + private String formatRunDisplay(String title, String agentMode, String status) { + return title + " [" + agentMode + "] - " + status; + } + + String startNewRun(String title, String agentMode, IHttpRequestResponse msg) { + String id = nextRunId(); + TestRun run = new TestRun(id, title, agentMode); + if (msg != null) { + run.requestRaw = bytesToString(msg.getRequest()); + run.responseRaw = bytesToString(msg.getResponse()); + } + runs.put(id, run); + + int index = testListModel.getSize(); + runIdToIndex.put(id, index); + testListModel.addElement(run); + filteredListModel.addElement(run); + + selectedRunId = id; + filteredList.setSelectedIndex(filteredListModel.getSize() - 1); + progressArea.setText(""); + finalRawArea.setText(""); + markdownPane.setText(""); + requestArea.setText(run.requestRaw); + responseArea.setText(run.responseRaw); + refreshOutputView(); + return id; + } + + void setRunStatus(String runId, String status) { + TestRun run = runs.get(runId); + if (run == null) return; + synchronized (run) { + run.status = status; + } + Integer index = runIdToIndex.get(runId); + if (index != null) { + SwingUtilities.invokeLater(() -> filteredList.repaint()); + } + } + + void setRunConversationId(String runId, String conversationId) { + if (runId == null) return; + TestRun run = runs.get(runId); + if (run == null) return; + synchronized (run) { + run.conversationId = conversationId == null ? "" : conversationId; + } + } + + void appendToRun(String runId, String s) { + // Backward compatibility: default to progress bucket + appendProgressToRun(runId, s); + } + + void appendProgressToRun(String runId, String s) { + if (runId == null || s == null) return; + TestRun run = runs.get(runId); + if (run == null) return; + synchronized (run) { + run.buffer.append(s); + run.progressBuffer.append(s); + } + if (runId.equals(selectedRunId)) { + SwingUtilities.invokeLater(() -> { + progressArea.append(s); + progressArea.setCaretPosition(progressArea.getDocument().getLength()); + }); + } + } + + void appendFinalToRun(String runId, String s) { + if (runId == null || s == null) return; + TestRun run = runs.get(runId); + if (run == null) return; + synchronized (run) { + run.buffer.append(s); + run.finalBuffer.append(s); + } + if (runId.equals(selectedRunId)) { + SwingUtilities.invokeLater(() -> { + finalRawArea.append(s); + finalRawArea.setCaretPosition(finalRawArea.getDocument().getLength()); + }); + } + } + + void setFinalResponse(String runId, String finalResponse) { + if (runId == null) return; + TestRun run = runs.get(runId); + if (run == null) return; + synchronized (run) { + run.finalResponse = finalResponse == null ? "" : finalResponse; + } + if (runId.equals(selectedRunId)) { + SwingUtilities.invokeLater(this::refreshOutputView); + } + } + + private String getSelectedRunIdFromList() { + TestRun run = filteredList.getSelectedValue(); + return run == null ? null : run.id; + } + + private void setLogAreaToRun(String runId) { + TestRun run = runs.get(runId); + if (run == null) return; + selectedRunId = runId; + String progress; + String fin; + synchronized (run) { + progress = run.progressBuffer.toString(); + fin = run.finalBuffer.toString(); + } + SwingUtilities.invokeLater(() -> { + progressArea.setText(progress); + progressArea.setCaretPosition(progressArea.getDocument().getLength()); + finalRawArea.setText(fin); + finalRawArea.setCaretPosition(finalRawArea.getDocument().getLength()); + requestArea.setText(run.requestRaw == null ? "" : run.requestRaw); + responseArea.setText(run.responseRaw == null ? "" : run.responseRaw); + refreshOutputView(); + }); + } + + private void clearAllRuns() { + runs.clear(); + runIdToIndex.clear(); + testListModel.clear(); + filteredListModel.clear(); + selectedRunId = null; + SwingUtilities.invokeLater(() -> { + progressArea.setText(""); + finalRawArea.setText(""); + markdownPane.setText(""); + requestArea.setText(""); + responseArea.setText(""); + }); + } + + void clearAndShowStreamHeader(String title) { + SwingUtilities.invokeLater(() -> { + progressArea.setText(""); + finalRawArea.setText(title + "\n\n"); + }); + } + + // Legacy helpers kept for Validate logging + void appendStreamLine(String s) { + if (s == null) return; + SwingUtilities.invokeLater(() -> { + progressArea.append(s); + progressArea.append("\n"); + progressArea.setCaretPosition(progressArea.getDocument().getLength()); + }); + } + + private void log(String s) { + appendStreamLine("[*] " + s); + } + + private void applyFilter() { + String q = searchField.getText(); + if (q == null) q = ""; + String query = q.trim().toLowerCase(); + filteredListModel.clear(); + for (int i = 0; i < testListModel.size(); i++) { + TestRun r = testListModel.getElementAt(i); + if (query.isEmpty() || (r.title != null && r.title.toLowerCase().contains(query))) { + filteredListModel.addElement(r); + } + } + if (filteredListModel.size() > 0 && filteredList.getSelectedIndex() < 0) { + filteredList.setSelectedIndex(0); + } + } + + private void refreshOutputView() { + if (!renderMarkdownBox.isSelected()) { + outputCardsLayout.show(outputCards, "raw"); + return; + } + + if (selectedRunId == null) { + outputCardsLayout.show(outputCards, "raw"); + return; + } + + TestRun run = runs.get(selectedRunId); + if (run == null) { + outputCardsLayout.show(outputCards, "raw"); + return; + } + + String finalResp; + synchronized (run) { + finalResp = run.finalResponse; + } + if (finalResp == null || finalResp.trim().isEmpty()) { + // while streaming, stick to raw for performance + outputCardsLayout.show(outputCards, "raw"); + return; + } + + String html = MarkdownRenderer.toHtml(finalResp); + markdownPane.setText(html); + markdownPane.setCaretPosition(0); + outputCardsLayout.show(outputCards, "md"); + } + private static String bytesToString(byte[] bytes) { + if (bytes == null || bytes.length == 0) return ""; + return new String(bytes, StandardCharsets.ISO_8859_1); + } + + @Override + public String getTabCaption() { + return "CyberStrikeAI"; + } + + @Override + public Component getUiComponent() { + return root; + } +} + diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/HttpMessageFormatter.java b/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/HttpMessageFormatter.java new file mode 100644 index 00000000..792465b0 --- /dev/null +++ b/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/HttpMessageFormatter.java @@ -0,0 +1,66 @@ +package burp; + +import java.nio.charset.StandardCharsets; +import java.util.List; + +final class HttpMessageFormatter { + private HttpMessageFormatter() {} + + static String getRequestTitle(IExtensionHelpers helpers, IHttpRequestResponse msg) { + IRequestInfo reqInfo = helpers.analyzeRequest(msg); + String method = reqInfo.getMethod(); + if (reqInfo.getUrl() == null) { + return method + " (unknown)"; + } + String host = reqInfo.getUrl().getHost(); + String path = reqInfo.getUrl().getPath(); + if (path == null || path.isEmpty()) path = "/"; + String query = reqInfo.getUrl().getQuery(); + String shortPath = path; + if (shortPath.length() > 80) shortPath = shortPath.substring(0, 77) + "..."; + String q = (query != null && !query.isEmpty()) ? "?" : ""; + return method + " " + host + shortPath + q; + } + + static String toPrompt(IExtensionHelpers helpers, IHttpRequestResponse msg) { + IRequestInfo reqInfo = helpers.analyzeRequest(msg); + String method = reqInfo.getMethod(); + String url = reqInfo.getUrl() != null ? reqInfo.getUrl().toString() : "(unknown)"; + + byte[] reqBytes = msg.getRequest(); + int bodyOffset = reqInfo.getBodyOffset(); + String headers = String.join("\n", reqInfo.getHeaders()); + String body = ""; + if (reqBytes != null && reqBytes.length > bodyOffset) { + body = new String(reqBytes, bodyOffset, reqBytes.length - bodyOffset, StandardCharsets.ISO_8859_1); + } + + // Include response summary if available + String respSnippet = ""; + byte[] respBytes = msg.getResponse(); + if (respBytes != null && respBytes.length > 0) { + IResponseInfo respInfo = helpers.analyzeResponse(respBytes); + List respHeaders = respInfo.getHeaders(); + int respBodyOffset = respInfo.getBodyOffset(); + String respBody = ""; + if (respBytes.length > respBodyOffset) { + int max = Math.min(respBytes.length - respBodyOffset, 4096); + respBody = new String(respBytes, respBodyOffset, max, StandardCharsets.ISO_8859_1); + } + respSnippet = "\n\n[Optional: Response (truncated)]\n" + + String.join("\n", respHeaders) + + "\n\n" + + respBody; + } + + return "" + + "针对该流量做web渗透测试,并输出测试结果,要求:只针对该接口流量做测试,切勿拓展其他接口\n\n" + + "[Target]\n" + + method + " " + url + "\n\n" + + "[Request]\n" + + headers + "\n\n" + + body + + respSnippet; + } +} + diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/MarkdownRenderer.java b/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/MarkdownRenderer.java new file mode 100644 index 00000000..b1666f0c --- /dev/null +++ b/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/MarkdownRenderer.java @@ -0,0 +1,195 @@ +package burp; + +import java.util.ArrayList; +import java.util.List; + +/** + * Minimal Markdown -> HTML renderer for Burp UI. + * Supports: headings (#..######), fenced code blocks (```), inline code (`), + * bold (**), lists (-/*), paragraphs, and basic escaping. + * + * Not a full CommonMark implementation; kept dependency-free on purpose. + */ +final class MarkdownRenderer { + private MarkdownRenderer() {} + + static String toHtml(String markdown) { + if (markdown == null) markdown = ""; + + List lines = splitLines(markdown); + StringBuilder out = new StringBuilder(4096); + out.append("") + .append(""); + + boolean inCode = false; + boolean inList = false; + StringBuilder codeBuf = new StringBuilder(); + + for (String raw : lines) { + String line = raw == null ? "" : raw; + + if (line.trim().startsWith("```")) { + if (!inCode) { + inCode = true; + codeBuf.setLength(0); + } else { + // close code + out.append("
")
+                            .append(escapeHtml(codeBuf.toString()))
+                            .append("
"); + inCode = false; + } + continue; + } + + if (inCode) { + codeBuf.append(line).append("\n"); + continue; + } + + String trimmed = line.trim(); + if (trimmed.isEmpty()) { + if (inList) { + out.append(""); + inList = false; + } + out.append("
"); + continue; + } + + // headings + int h = headingLevel(trimmed); + if (h > 0) { + if (inList) { + out.append(""); + inList = false; + } + String text = trimmed.substring(h).trim(); + out.append("") + .append(inlineFormat(text)) + .append(""); + continue; + } + + // list items + if (trimmed.startsWith("- ") || trimmed.startsWith("* ")) { + if (!inList) { + out.append("
    "); + inList = true; + } + String item = trimmed.substring(2).trim(); + out.append("
  • ").append(inlineFormat(item)).append("
  • "); + continue; + } + + // normal paragraph + if (inList) { + out.append("
"); + inList = false; + } + out.append("

").append(inlineFormat(trimmed)).append("

"); + } + + if (inCode) { + out.append("
")
+                    .append(escapeHtml(codeBuf.toString()))
+                    .append("
"); + } + if (inList) { + out.append(""); + } + + out.append(""); + return out.toString(); + } + + private static int headingLevel(String s) { + int i = 0; + while (i < s.length() && s.charAt(i) == '#') i++; + if (i >= 1 && i <= 6 && i < s.length() && Character.isWhitespace(s.charAt(i))) return i; + return 0; + } + + private static String inlineFormat(String text) { + // escape first, then apply simple replacements using placeholders + String escaped = escapeHtml(text); + + // inline code: `code` + escaped = replaceInlineCode(escaped); + + // bold: **text** + escaped = replaceBold(escaped); + + return escaped; + } + + private static String replaceInlineCode(String s) { + StringBuilder out = new StringBuilder(s.length() + 16); + boolean in = false; + StringBuilder buf = new StringBuilder(); + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + if (c == '`') { + if (!in) { + in = true; + buf.setLength(0); + } else { + out.append("").append(buf).append(""); + in = false; + } + continue; + } + if (in) buf.append(c); + else out.append(c); + } + if (in) { + // unmatched backtick: keep as literal + out.append("`").append(buf); + } + return out.toString(); + } + + private static String replaceBold(String s) { + // simple non-nested **...** + StringBuilder out = new StringBuilder(s.length() + 16); + int i = 0; + while (i < s.length()) { + int start = s.indexOf("**", i); + if (start < 0) { + out.append(s.substring(i)); + break; + } + int end = s.indexOf("**", start + 2); + if (end < 0) { + out.append(s.substring(i)); + break; + } + out.append(s.substring(i, start)); + out.append("").append(s, start + 2, end).append(""); + i = end + 2; + } + return out.toString(); + } + + private static String escapeHtml(String s) { + if (s == null) return ""; + return s.replace("&", "&") + .replace("<", "<") + .replace(">", ">") + .replace("\"", """); + } + + private static List splitLines(String s) { + String[] parts = s.split("\\r?\\n", -1); + List lines = new ArrayList<>(parts.length); + for (String p : parts) lines.add(p); + return lines; + } +} + diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/SimpleJson.java b/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/SimpleJson.java new file mode 100644 index 00000000..e798fb52 --- /dev/null +++ b/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/SimpleJson.java @@ -0,0 +1,80 @@ +package burp; + +import java.util.HashMap; +import java.util.Map; + +/** + * Minimal JSON extractor for the SSE payloads we emit: + * {"type":"...","message":"...","data":...} + * + * This is NOT a general-purpose JSON parser; it's intentionally small to avoid external deps. + */ +final class SimpleJson { + private SimpleJson() {} + + static Map extractTopLevelStringFields(String json, String... keys) { + Map out = new HashMap<>(); + if (json == null) return out; + for (String key : keys) { + out.put(key, extractStringField(json, key)); + } + return out; + } + + static String extractStringField(String json, String key) { + if (json == null || key == null) return ""; + String needle = "\"" + key + "\""; + int k = json.indexOf(needle); + if (k < 0) return ""; + int colon = json.indexOf(':', k + needle.length()); + if (colon < 0) return ""; + int i = colon + 1; + while (i < json.length() && Character.isWhitespace(json.charAt(i))) i++; + if (i >= json.length() || json.charAt(i) != '"') return ""; + i++; // after opening quote + StringBuilder sb = new StringBuilder(); + boolean esc = false; + while (i < json.length()) { + char c = json.charAt(i++); + if (esc) { + switch (c) { + case '"': sb.append('"'); break; + case '\\': sb.append('\\'); break; + case '/': sb.append('/'); break; + case 'b': sb.append('\b'); break; + case 'f': sb.append('\f'); break; + case 'n': sb.append('\n'); break; + case 'r': sb.append('\r'); break; + case 't': sb.append('\t'); break; + case 'u': + if (i + 3 < json.length()) { + String hex = json.substring(i, i + 4); + try { + sb.append((char) Integer.parseInt(hex, 16)); + i += 4; + } catch (NumberFormatException ignored) { + // best-effort: keep raw + sb.append("\\u").append(hex); + i += 4; + } + } + break; + default: + sb.append(c); + } + esc = false; + continue; + } + if (c == '\\') { + esc = true; + continue; + } + if (c == '"') { + break; + } + sb.append(c); + } + return sb.toString(); + } +} + diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/BurpExtender$1.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/BurpExtender$1.class new file mode 100644 index 0000000000000000000000000000000000000000..07d7e8b6f619ff3bd041c568a1a8b0f95e071e0d GIT binary patch literal 3939 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 XE2)QxQNI)TCEkd}@Fvc&+#CK25MlLI literal 0 HcmV?d00001 diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/BurpExtender.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/BurpExtender.class new file mode 100644 index 0000000000000000000000000000000000000000..57d17f831346abc9061908f1023763b2347f6794 GIT binary patch literal 4961 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 b+>K`m%Y+HxDV_y(1#4u*Kg6(t^{w$=7o7$X literal 0 HcmV?d00001 diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient$Config.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient$Config.class new file mode 100644 index 0000000000000000000000000000000000000000..f2a79c3cf9b8361f99c120cb15ad747a94178765 GIT binary patch literal 741 zcma)4O;6iE6r4>=oCFs_n$iHJd^86zg>dTugg}-Mh?E{Exv#^LE*Klx4v3${A*#fI zAHa{Qm~{#qAQA_A-afsZ8PD^>zq@+?KhP*6hrA8T!3YWhl{0xIn}H0w&0qeR>ZAgN zO&#iVOCZ0r+%BPrl8v&1Q8)r~elNakdN;m`kJ4D5tDSu>&?-zDUKF0{u7K^!L>NeiD1k<6sMyZa)P}&p(rcYJ zI`80GZVOmmraj)$p*rkc@H>A?KcJgxE9%IgEn{uY|C?6&M<)Uc!<`Odq0RD9)QdZ6 zR~xeW8wswNv>3~wO47Y3No{=P;4s?)&VCrG*bA7VqKCpj$;P6<;;>td=inIibB%Rw zAjjV$kBV6{tBToChFl9#@EJjk_=#1(X^U8M|3bJcec0~zK0dgseN=AQ&ta19N!|eG zEmkFb#u)14nqmdGgZu1E@kFLf*QnGoW#gu1ehGTYW16QNX7DA$S=ZGJd2%ce Izirna0awhcX8-^I literal 0 HcmV?d00001 diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient$StreamListener.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient$StreamListener.class new file mode 100644 index 0000000000000000000000000000000000000000..cb6eb8e7991ab130f6a6aafce4640b6c4d553829 GIT binary patch literal 400 zcma)2!A=4(5Pb#Rt}7yX@&imn4(`zyPGrSELi9l5y}Ox^!rGFy5dAd{egGe3oZ`Wl zi19Kn^JeDF%-eo!-T~a=T%sXxRj%AJFWyRW)8O=i2IHdEWWptEzE-ph+M0eGORTxK zh6I}3m}XPEauq%3nyHIle!7VV3Z#$Z!^rv|amtPR91v)Y4ZmL0%6swx?Vpw;0B>e5 jfhL=C2qqXM(j6WlixnJmY@mgc9k$V7%y^RZaF(Q>z%XkR literal 0 HcmV?d00001 diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAIClient.class new file mode 100644 index 0000000000000000000000000000000000000000..d85bd5ff8584e49c1706b77dca9702817781d416 GIT binary patch literal 10691 zcmcIq33yx8mHv+{={?KOj-$j$GwTGUb@c;fFi~c}Z=oEP;H=?nD%sL`VAxLeWm3^Sc6(Q6ENaIyD>@VL(dcf0 zF&s|Y+fy+?pl61*njGKVrl?g~n5RgY$#6QoFOiD)F&_Z~3oI-|wP4BV9wG3?61$^u z!6kLGNzd-7pWUS%wb;TE1o`~E;aD^h&e(#LuaDkbZ6G=PH zhs3G0Xo6CysdH(%yv>ZY8K~pQc-2R-nyL~^|Xww7_hKI`LuT=mPp$M z1_cZBTJ7HbW2wZx@Nmrb<7(`*unTV#RD>guzHBm?veRihqNG;fG}9~E6#bRB*20?* zc7(mnPA6&LwD$;kAX0Rx86y@VN>!EI>n1xKu~QqPc1+vNsD<4abB4O&G@87k78fY0 zV1N=`iR&!v$uHWFN+lHNP`k=1#x2B=Al|Se(jFt;)VsV>QiXKpbhP=n-a-o0MMW%; z*pu!dlx@n4lggZqH>A{?wXhfaX!)5$Phy{)>Lk!nJ9+lCkR4^WnK&RQ%h>xfEn}pr zR^MphCfrOj7@>cJqj5fZX`!%{A@wO|i;viC^+N`3&1+BXXUm5D${pxICf+QF_b4C? zjfSH!JJK3T+o`>FDwMJ_*;L$)gf{i}_B4g!iA<<{YgeedZ_DOYq0TXTWKXDTYs=O| zDiflGhwOMdo3cX(64_8P5sha;nM9}v*+awOkv(=ivdWKJu-wG$G%Z_c!H>7&9R}WM z;av)`=V`?5i;gE_+B@mh+<7WIqI68ycWs~>@3!zB+)159(;LQ<8On%;GZbJ%x=Uf` z-3p1j3JlPd<{TOfpcMD0HSbdz>zZ?h2g^)+kUVD++=Yn`3D!GuqqS?}4UI?BX)?&2 zb4Ff9?yf_04doVERwF4pLQso_W9d}^A~Y#~nA~5vq2I(uXhiK<;$td$g9f<(d{`EM zfxA?^d%(hjc!=f@-c1U<+Fw@moG!?%XwT0gP(6%C3`|&fRIRUl?Iql6@AjVlE)$<( zIBE$eqb=jvSSH%6AKjAH&STnq{Bl|z;^PCwgNr7J%w6yyG$G- zWYA@3-)Sw}u84`x3&`kkhMiO*Mxgsb5#SQG2nhj{;Y$|2jOWQjD$DqoDs(s3vd|}V2HH-qD9$Go^+eN*c6O?*koj%dcw8YZao`0aM3GZ9JL~*-4qsKV{>2&K(g-rW zb~bAYg`dOME&R1cd1e0<0k%wy6<%jyI68GUB9x-a&@tAR{#~b zM=9_hEPNN=qo9b}r=%;V*NuAg4=nr;KcY1-nabK*MqhieE9L+y@ndCaKM{2QFBDUV zvV|gd$r|`4?tUidIo%!EXpFH)G5m82zfdvE7qjELGh=@I6#uN$@GF(WbSVjU zQv%;;A~hc7RxX``(VYdRHix=h(Q@Bna^F%WIHRuf^t)3N%PlfYlQc64XSpGjWK=7L z@vI{|I%*SAx9J?gkSakiKUNUCongPslK^!j3k0iO_D_lN&Iaa8rw05|A=PU6A_ml% zR#50`$4F_NDa_WrYljn&1Ew$!pRe-*d#_58)A@Wx8Z2p)CN9b(RE8@! z+vRl{ie^i^Ex=Oh9#dLKpOs9wRjK@ZOIE9}SeDKXlRU$lDHkemAou06MlLqw5=$-> zCfO@b8&asW0&t@NCgK|u!*d%@f&DnzE(CYChvk8+B^!|h1xq&9S#r5t!TmDlVN^XO z@yeUwkm9(*l1_zqzC?VzUcFK_Sh7)d`6JOZF;3M$hA^8i$akkRCcj)M-IlyT>DEtx z>vaPcDfe2kS++RaQ;ChBVGjQ&*xocz8V)z(WWV#2v24zcvncLYu&+wr#7HHIE*QsJr)ruTY zd6}*(RXVHleI^tv$42%r6l*CO!VS+E?A2 z>s;%ol0_q7)*G>o1D!=F7SW?Gx;q|bJwd&6oq|NKllmNZMXitU)5%YiA7yUoVPgL* zcJq;v;)&6@IB%GuS>nu_6+pO=66IRe)8hp}go8qhSP%=34@bf)(pquKN>-dFxc1fE zy~r@8_3*ltt1zNu|LSSRbl9G$syUcpm?#}j(@{O@WQ448ukJSV>}l8JHvD~wY-+^b z$fA$3D9S3GL%3BchSGsH>k}J=M-)m`Mo0$|Tz8_Q;7u&-|%RDL*?Uz-@g9;zr9!8d(ogH(L&J_4Qsg-qMbWB zEfSuJb}>gub;fw)tquTvRHi;HFPkp+8C9vCf|z2+mjvg`lH6Q6HspC8D!%$uKGZP? z9^cOAiHrIx=Z9|rAhMOM79Ogyu!gtcFysj~O5`eDIm~ONY~$5(CP<(3^BZKl3~-iO zd<_p|N_k(>(D)P#ekyXP>eXMGa#+-Kh+_`DN=jT#efkFx5SJ1Tn5P zk05yv)j{I~YJx@%nZW)WZnzH>$8gJF;I_kf%kiKYcYj7djaS>Op;o6J2`Xb!S^Zna# zDegoo&x|g^S1IT3aMlmd!Ropbf53Y2VxufXmz=?Rpb@=tA&<`2VhdCItF&3%K-F*J zD}*80Ni$R#W8Uz(sCI3P(xu)ek?TrnlU?#g8q#7}E!W7kG>vw~ls9qIOHQ7bund#R zop?q@*k_QdgA!rOBv0dFvsFe8s*?kgcvQ>5xOL$vSx#%QFvAf8;`F6@NZwYb_2Km_Qn)iLP z&HJD>@4)>{llUm0jawO`x7zF4p!YO3=yPY3^Da#fxaQ;y`X=!)$50dmIJ!TVXKA2j zD=|Rb@1X9lMk5BP{UP*YC(rzMA&YCY&New5=QYJ6b5~PrX;&tdvAm{mt*fckv<9Ug zFX`24t@yMC7Q^#rC3z)wapbp<@~SEjm`WwDb0Cby@dTaP2t3(*6i=062b+_DXQtcF=G({c++fhxM1S{8;)_7w z#9@3Thp#F5c(iXg@(E)BjU_~B)WfDnjN%Hu^5~%-h4CTw-lyfW&0%m_KDG;WWZIRF zYJHB@sNmF=Jrbi8EWkDyXP=k!H%OcnR1hb>QGfy8c0fcU>36iLDFk(~)Eo3VSn6fZDt>XX)azm?duEJK z5!TrHw@TPSufkS}I_R6hRwCcI3i&j)5=<4gI$y2UvY@HJYbaHYl{sHH4WC7DX(%9k$+2$@m&PRiE^qE7Na0q#p|~3FqryHs4Shpc zL~-6v!~FA` zpI>W-@{p^aXovEWj|mNZK0Y_1UCSU39S-1W^B6^WW!V(cMfl~q8m-3QmIzuJ;rIi9 zX#gymQ3!HGwgL}5iRC2nGGTcpa{JW@mt%)`g?xJ`)zOB)lSlFQB{+fk`Q{OPU-|4a zJq>}$nK7rCAM0%hJUcVyH1lJd8)K8~CZLR8=Xrt_y&W&mqrO6j{3>F2k>TKLxD8*&9ry5u-NcU*6wdlH1wZY^*JpQ%K>mO}ED zK2F19pvd$zE|4>Fa^^uSXKT4`EoSR%=B@`(!PYrCi#0qG@RUBz^-liar2Idp;D137 z{iWXDB8R@K%1W$~H*;@m#>VoF9 z*)i;uDT8bEpTI!Szd%+|!1qo4)@kBrIXO>RU3suv=l|yg%NNK6DwDT@<$)(vqoO%z z1uKH(N97`>4AK^~a&p;y@J;Z4>S0BlW*TJX@3bt^@+)dXLI3gQqteck3eO2uALV5I z1Xi_rn<-i83VM%9PpKZOamNC!m1?RgX=Ht{^7s>k)vH(p?xC%xun#xz{*qiEZMa%4 zlMdOSePD+~6Zi6&`}ou>f01y2x%~|cw>RPm{?y_*hTxa*W_r|H@oVP)f5O|O6mO?1 zyh9cdR%-Ds>f#PLk3UGb0C$noTbaweLuh7#``;Xe-G}J zyZBoI<)bgM6upVr*6s2(BJenW&-8Y-lq8&*MLFKttSKy5d}a;TTiny1IQmYu%IW>rx?`5S>;fD1)`Q}(<%m#P-n8pE<{8q@jr26f7*~Wy53PW$|(uK z+%xjHqN<*mgrHg%J_{+1lNchYmr-&hXHHRQ<#Rquicv~Yn_{^2o-&!JCRgs%l*%#h z)Iqg*^{05k6t_KVxk?J&%^4-~9=Vfulk!-@M9vge)Xd+jcnl(Pm%hGNU*D&%AJEr( z_4Ph|{jk1%L|;E9he_uFd5|Bq{$YKc(AQ7u>tp)*X?^{ys2^t5675YMY942xdzkm< Uu2@1&=F1m+rhHMpEGH2B3n>a~RsaA1 literal 0 HcmV?d00001 diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$1.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab$1.class new file mode 100644 index 0000000000000000000000000000000000000000..50419043e1f190593c6e16a69ef5e94cec0197cc GIT binary patch literal 951 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 literal 0 HcmV?d00001 diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/CyberStrikeAITab.class new file mode 100644 index 0000000000000000000000000000000000000000..b58b59d1247a9f52e1b56830ccdaa00125a253e1 GIT binary patch literal 25917 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 Q^5fZs=O!y|byLaz0a!$zn*aa+ literal 0 HcmV?d00001 diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/HttpMessageFormatter.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/HttpMessageFormatter.class new file mode 100644 index 0000000000000000000000000000000000000000..e4a781e52e4e715a892ab8df9525e9d5bd72eed1 GIT binary patch literal 3902 zcma)9?{^f{8GdfEo7v1xey|W^z(SBHn*a&Lf^kC;6M|Wr5Fmh+pg2i}WXWb`*_{Pq ze<-vFEh?=PMYP}#&{o@0YzZWA=sEpB&uKsO5Aa)0lY(FT3#fhW%@_VQ5i&7PgO2$E4~!VYW}9vG8_qKc zXNawgV^|J%^hk6jevu_rJcw^8Sg2udd2=tPH|airB^4G&2Z*|*tnhE&wy zVFiz9Sc>Rfk??jy%S5JqB;|~{q1YKhgMes~P|G!}kWe8)ZONMHQHj;0VI{uJjVDcO z&>3;qPP7#q;8V55eo&>^7TQ(*!ssmY5m5UuZR zl>&QO!}lad6&!7~2S&U1?8%r;2wmK;Dh;|dY{nLEdWUHYxZ;lF6qI!m$)?Uk#%Ynf z_Gs9K?E->NNlgy&+I{TE1)7Hxuh4?5tL$|6l7YUc{=5O4VcMm5vn5yz>y$X0qed% zX2RZ2Pm!e+9LOnGmc}kKlQ9O(jdps(a3~JSsm&gc1a~GZb5nMt&rENViXnTQcE6F_ zVWboC+wTlGLkS9DfmczBA+`{!kPO=rj>LK@SDwFK%3Hp%Y!?FKv&|wklsg0F`BP^= z$^d2t^G?Q#9SH)X`3}xx@a7vQJhsZ&2!50WKQ0bf?~;MSX$)EL$&8mp*T>% z(x6aad`#KFg|hNg;v)N6M;()~E9qsCQ~UDe$mP^8JptM6FW6%xQYn+Jmb>WQ945G7wr&!%eaWf#>NmnWfqHCAw&qj7g(yQz1=B?_Xr~ytKI6~4r-%LIx7!k zbD;h?Rj4YBFABVO`;B9h7sqd1yfAh7(CwoqCJ&uCVD?R2ee3qiC#EhRzjg7{m)BpN z93Q)NF}4=&rF{9q=57Kg~<~i=Ftiu$Bs@O|I5_z zlarTDO&%Hh_q8{tTuXYp%}6tq=v6KK>h;eT&q+~LhD$0w!=DuVS(cW|0(FIaNm%>s zVUs0XUR1mb$3~;yv875+Pp?3}p~q$i3x3kf)OFhSa5gplAemY1?wYubLMUS1J52=M zeebS=$cJb%lF6QgV^Zl_+_KDcThhp6%#4Do0uRsFQ!!T+Ob9IeW>coLw=dpX_Vbz{ z|4RAh#gx~OgZygZn|BZd8?HcHVxt73e9B=!!Haxqo&kPdAYu3hsdhjN~dTuLE4iQJC0_&Hk&XI0=h zTOqtk#3d-ZgGCA|71Z6qLwxeT^bVGKtyxd7>ObfveaWQzT_F0*m$FjheFa(66EHSv^=o>iIqJ8FpO3u2_g> z<;2-d9936u!qC+lXVKfBtK;Y^K`g9?$FYZ_nrtMvOa-S@(yFH7JeIicfmzjDbMKle zcL}woqNd7+uZ(o+8r{(=Cy-)j%l#ngU-c;=hBGCVA6Oar7YS8KwrZw+wG$InMDm{~;RjDFr{yng75l{1cDjb0SEMe?Vr( zDTUW@g7~jt6Mn&vhdH+$Z{Q?_bB;|BpT0 qC?zejc%0{Ez@P+~g90D9&)>MuPu%D4+~*%KMk|#TS4jIc=>G%JAPw;V literal 0 HcmV?d00001 diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/MarkdownRenderer.class b/plugins/burp-suite/cyberstrikeai-burp-extension/target/classes/burp/MarkdownRenderer.class new file mode 100644 index 0000000000000000000000000000000000000000..329c36a3a2b1a15ed81fa4b206f4eaf20018db3b GIT binary patch literal 5149 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 literal 0 HcmV?d00001 diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/cyberstrikeai-burp-extension-1.0.0.jar b/plugins/burp-suite/cyberstrikeai-burp-extension/target/cyberstrikeai-burp-extension-1.0.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..ae3e6ead5a827a8770d745607db54ebf50f69497 GIT binary patch literal 37918 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%0Dh< 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 J5d7BB{{Ui+ihKY7 literal 0 HcmV?d00001 diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-archiver/pom.properties b/plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-archiver/pom.properties new file mode 100644 index 00000000..e8f61d98 --- /dev/null +++ b/plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-archiver/pom.properties @@ -0,0 +1,3 @@ +artifactId=cyberstrikeai-burp-extension +groupId=ai.cyberstrike +version=1.0.0 diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 00000000..fd49ad75 --- /dev/null +++ b/plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,14 @@ +burp/CyberStrikeAIClient$StreamListener.class +burp/CyberStrikeAIClient$Config.class +burp/CyberStrikeAIClient$AgentMode.class +burp/MarkdownRenderer.class +burp/SimpleJson.class +burp/CyberStrikeAIClient.class +burp/CyberStrikeAITab$DotIcon.class +burp/CyberStrikeAITab.class +burp/CyberStrikeAITab$1.class +burp/BurpExtender$1.class +burp/BurpExtender.class +burp/CyberStrikeAITab$TestRun.class +burp/CyberStrikeAITab$TestRunCellRenderer.class +burp/HttpMessageFormatter.class diff --git a/plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 00000000..1f4d83a9 --- /dev/null +++ b/plugins/burp-suite/cyberstrikeai-burp-extension/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,6 @@ +/Users/temp/Downloads/CyberStrikeAI-main/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/BurpExtender.java +/Users/temp/Downloads/CyberStrikeAI-main/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/CyberStrikeAIClient.java +/Users/temp/Downloads/CyberStrikeAI-main/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/CyberStrikeAITab.java +/Users/temp/Downloads/CyberStrikeAI-main/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/HttpMessageFormatter.java +/Users/temp/Downloads/CyberStrikeAI-main/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/MarkdownRenderer.java +/Users/temp/Downloads/CyberStrikeAI-main/plugins/burp-suite/cyberstrikeai-burp-extension/src/main/java/burp/SimpleJson.java