From 48563d193a78537cee0a37ea47d9fa41627d8e79 Mon Sep 17 00:00:00 2001 From: Anthony Rose <20302208+Cx01N@users.noreply.github.com> Date: Sun, 1 Mar 2026 13:12:07 -0500 Subject: [PATCH 1/6] Fix module execution snackbar displaying [object Object] instead of agent name (#258) --- CHANGELOG.md | 4 ++++ src/components/agents/AgentExecuteModule.vue | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f56caff5..0fa8c484 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed + +- Fixed module execution snackbar displaying "[object Object]" instead of agent name + ## [3.3.0] - 2026-01-18 ### Added diff --git a/src/components/agents/AgentExecuteModule.vue b/src/components/agents/AgentExecuteModule.vue index 333f280d..fc910944 100644 --- a/src/components/agents/AgentExecuteModule.vue +++ b/src/components/agents/AgentExecuteModule.vue @@ -453,7 +453,7 @@ export default { const displayName = this.agents.length > 1 ? `${this.agents.length} agents.` - : `${this.agents[0]}.`; + : `${this.agents[0].name}`; this.$snack.info(`Module execution queued for ${displayName}`); this.selectedItem = {}; this.selectedModule = ""; From b5b46208caa16aaceffd03381a5da91dcbe0aed9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Maes?= <55604242+jfmaes@users.noreply.github.com> Date: Tue, 3 Mar 2026 06:35:40 +0200 Subject: [PATCH 2/6] Jobview (#108) --- CHANGELOG.md | 5 + src/api/agent-task-api.js | 17 + src/components/agents/AgentJobs.vue | 513 ++++++++++++++++++++++++++++ src/views/AgentEdit.vue | 18 +- 4 files changed, 551 insertions(+), 2 deletions(-) create mode 100644 src/components/agents/AgentJobs.vue diff --git a/CHANGELOG.md b/CHANGELOG.md index 0fa8c484..3d04644a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Added + +- Added Jobs tab to agent page for viewing and managing background jobs +- Added ability to kill background jobs from the Jobs tab + ### Fixed - Fixed module execution snackbar displaying "[object Object]" instead of agent name diff --git a/src/api/agent-task-api.js b/src/api/agent-task-api.js index 59f32fad..755038fe 100644 --- a/src/api/agent-task-api.js +++ b/src/api/agent-task-api.js @@ -159,6 +159,11 @@ export function updateSleep(sessionId, delay, jitter) { .catch((error) => Promise.reject(handleError(error))); } +/** + * Task the agent to report its background jobs. + * Returns the created task object; poll with getTask() for actual results. + * @param {string} sessionId agent sessionId + */ export function getJobs(sessionId) { return axios .post(`/agents/${sessionId}/tasks/jobs`) @@ -166,6 +171,18 @@ export function getJobs(sessionId) { .catch((error) => Promise.reject(handleError(error))); } +/** + * Kill a background job on an agent. + * @param {string} sessionId agent sessionId + * @param {number} jobId job ID to kill + */ +export function killJob(sessionId, jobId) { + return axios + .post(`/agents/${sessionId}/tasks/kill_job`, { id: jobId }) + .then(({ data }) => data) + .catch((error) => Promise.reject(handleError(error))); +} + export function updateProxies(sessionId, proxies) { return axios .post(`/agents/${sessionId}/tasks/proxy_list`, proxies) diff --git a/src/components/agents/AgentJobs.vue b/src/components/agents/AgentJobs.vue new file mode 100644 index 00000000..f7efff25 --- /dev/null +++ b/src/components/agents/AgentJobs.vue @@ -0,0 +1,513 @@ + + + + + + diff --git a/src/views/AgentEdit.vue b/src/views/AgentEdit.vue index 46694c6d..01fc45bb 100644 --- a/src/views/AgentEdit.vue +++ b/src/views/AgentEdit.vue @@ -16,6 +16,10 @@ Tasks fa-sticky-note + + Jobs + fa-cogs + View fa-eye @@ -206,6 +210,16 @@ /> + + + + + Date: Thu, 5 Mar 2026 23:17:40 -0700 Subject: [PATCH 3/6] Vue 3 / Vuetify 3 Migration (#259) --- .eslintrc.js | 12 +- .github/workflows/lint-and-test.yml | 2 +- .github/workflows/release-private-start.yml | 2 +- .github/workflows/release-private-tag.yml | 2 +- .github/workflows/release-public-start.yml | 2 +- .github/workflows/release-public-tag.yml | 2 +- .../workflows/release-sponsor-kali-start.yml | 2 +- .../workflows/release-sponsor-kali-tag.yml | 2 +- CHANGELOG.md | 8 + package.json | 24 +- src/App.vue | 82 +- src/app.scss | 9 +- src/components/AuthorChips.vue | 5 +- src/components/AutoRunModules.vue | 100 +- src/components/Chat.vue | 420 +++- src/components/ClickToEdit.vue | 105 +- src/components/Confirm.vue | 8 +- src/components/DateTimeDisplay.vue | 6 +- src/components/DynamicFormInput.vue | 47 +- src/components/EditPageTop.vue | 18 +- src/components/ErrorStateAlert.vue | 12 +- src/components/FileInput.vue | 19 +- src/components/FileUploadDialog.vue | 26 +- src/components/GeneralForm.vue | 33 +- src/components/HeaderMenu.vue | 23 +- src/components/InfoViewer.vue | 8 +- src/components/ListPageTop.vue | 18 +- src/components/Login.vue | 27 +- src/components/NotificationBell.vue | 44 +- src/components/SideNav.vue | 162 +- src/components/SocketNotifications.vue | 22 +- src/components/StarkillerSnackbar.vue | 11 +- src/components/TagChip.vue | 31 +- src/components/TechniqueChips.vue | 2 +- src/components/TooltipButton.vue | 9 +- src/components/TooltipButtonToggle.vue | 15 +- src/components/agents/AgentDownloadDialog.vue | 27 +- src/components/agents/AgentExecuteModule.vue | 78 +- src/components/agents/AgentFileBrowser.vue | 66 +- src/components/agents/AgentForm.vue | 68 +- src/components/agents/AgentInteract.vue | 89 +- src/components/agents/AgentJobs.vue | 73 +- src/components/agents/AgentTasksList.vue | 19 +- src/components/agents/AgentTasksTable.vue | 365 ++- src/components/agents/AgentTerminal.vue | 29 +- src/components/agents/AgentUploadDialog.vue | 19 +- src/components/agents/AgentsList.vue | 15 +- src/components/agents/AgentsTable.vue | 125 +- src/components/agents/ExecuteModuleDialog.vue | 11 +- src/components/listeners/ListenersList.vue | 9 +- src/components/listeners/ListenersTable.vue | 46 +- .../listeners/MalleableProfilesList.vue | 242 +- src/components/modules/ModulesTable.vue | 53 +- src/components/plugins/PluginMarketplace.vue | 74 +- src/components/plugins/PluginTasksList.vue | 4 +- src/components/plugins/PluginTasksTable.vue | 347 ++- src/components/plugins/PluginsList.vue | 25 +- src/components/stagers/StagersTable.vue | 32 +- src/components/tables/AdvancedTable.vue | 4 +- .../tables/ExpansionPanelBoolean.vue | 5 +- .../tables/ExpansionPanelFilter.vue | 24 +- .../tables/ExpansionPanelSearch.vue | 19 +- src/main.js | 38 +- src/mixins/copy-stager.js | 12 +- src/plugins/vuetify.js | 59 +- src/router/index.js | 10 +- src/stores/agent-module.js | 25 +- src/stores/application-module.js | 2 + src/utils/clipboard.js | 12 + src/utils/tags.js | 16 + src/views/About.vue | 2 +- src/views/AgentEdit.vue | 315 +-- src/views/BypassEdit.vue | 44 +- src/views/Bypasses.vue | 35 +- src/views/CredentialEdit.vue | 42 +- src/views/Credentials.vue | 85 +- src/views/Downloads.vue | 128 +- src/views/ListenerEdit.vue | 127 +- src/views/MalleableProfileEdit.vue | 44 +- src/views/ModuleExecute.vue | 12 +- src/views/Modules.vue | 4 +- src/views/Notifications.vue | 45 +- src/views/Obfuscation.vue | 198 +- src/views/PluginEdit.vue | 115 +- src/views/Settings.vue | 68 +- src/views/StagerEdit.vue | 72 +- src/views/Stagers.vue | 10 +- src/views/UserEdit.vue | 61 +- src/views/Users.vue | 35 +- vite.config.js | 17 +- yarn.lock | 1960 ++++++----------- 91 files changed, 3329 insertions(+), 3452 deletions(-) create mode 100644 src/utils/clipboard.js create mode 100644 src/utils/tags.js diff --git a/.eslintrc.js b/.eslintrc.js index 42a94355..4405f033 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -8,7 +8,11 @@ module.exports = { env: { es2021: true, }, - extends: ["plugin:vue/recommended", "@vue/eslint-config-airbnb", "prettier"], + extends: [ + "plugin:vue/vue3-recommended", + "@vue/eslint-config-airbnb", + "prettier", + ], rules: { "no-console": process.env.NODE_ENV === "production" ? "error" : "off", "no-debugger": process.env.NODE_ENV === "production" ? "error" : "off", @@ -61,5 +65,11 @@ module.exports = { mocha: true, }, }, + { + files: ["src/plugins/vuetify.js"], + rules: { + "import/no-unresolved": "off", + }, + }, ], }; diff --git a/.github/workflows/lint-and-test.yml b/.github/workflows/lint-and-test.yml index 5e915a94..649e2a6b 100644 --- a/.github/workflows/lint-and-test.yml +++ b/.github/workflows/lint-and-test.yml @@ -17,7 +17,7 @@ jobs: - uses: actions/checkout@v6 - uses: actions/setup-node@v6 with: - node-version: 16 + node-version: 20 cache: "yarn" - name: Get app version run: | diff --git a/.github/workflows/release-private-start.yml b/.github/workflows/release-private-start.yml index 30cb989c..862755e1 100644 --- a/.github/workflows/release-private-start.yml +++ b/.github/workflows/release-private-start.yml @@ -36,7 +36,7 @@ jobs: git config user.email noreply@github.com - uses: actions/setup-node@v6 with: - node-version: 16 + node-version: 20 - name: Change version number run: | if [ -n "${{ github.event.inputs.overrideVersion }}" ]; then diff --git a/.github/workflows/release-private-tag.yml b/.github/workflows/release-private-tag.yml index 1c58c93c..9d3513c7 100644 --- a/.github/workflows/release-private-tag.yml +++ b/.github/workflows/release-private-tag.yml @@ -23,7 +23,7 @@ jobs: git config user.email noreply@github.com - uses: actions/setup-node@v6 with: - node-version: 16 + node-version: 20 - name: Set application version as variable run: | echo "APP_VERSION=$(npm pkg get version | sed 's/"//g')" >> $GITHUB_ENV diff --git a/.github/workflows/release-public-start.yml b/.github/workflows/release-public-start.yml index 853b7646..0c95a15e 100644 --- a/.github/workflows/release-public-start.yml +++ b/.github/workflows/release-public-start.yml @@ -31,7 +31,7 @@ jobs: git config user.email noreply@github.com - uses: actions/setup-node@v6 with: - node-version: 16 + node-version: 20 - name: Get app version run: | echo "APP_VERSION=$(npm pkg get version | sed 's/"//g')" >> $GITHUB_ENV diff --git a/.github/workflows/release-public-tag.yml b/.github/workflows/release-public-tag.yml index 2f34f74f..eab39659 100644 --- a/.github/workflows/release-public-tag.yml +++ b/.github/workflows/release-public-tag.yml @@ -27,7 +27,7 @@ jobs: echo "LATEST_TAG=$latest_tag" >> $GITHUB_ENV - uses: actions/setup-node@v6 with: - node-version: 16 + node-version: 20 cache: "yarn" - name: Set application version as variable run: | diff --git a/.github/workflows/release-sponsor-kali-start.yml b/.github/workflows/release-sponsor-kali-start.yml index 2e017f67..8ee2e129 100644 --- a/.github/workflows/release-sponsor-kali-start.yml +++ b/.github/workflows/release-sponsor-kali-start.yml @@ -23,7 +23,7 @@ jobs: git config user.email noreply@github.com - uses: actions/setup-node@v6 with: - node-version: 16 + node-version: 20 - name: Get app version run: | echo "APP_VERSION=$(npm pkg get version | sed 's/"//g')" >> $GITHUB_ENV diff --git a/.github/workflows/release-sponsor-kali-tag.yml b/.github/workflows/release-sponsor-kali-tag.yml index 955821e1..eea23982 100644 --- a/.github/workflows/release-sponsor-kali-tag.yml +++ b/.github/workflows/release-sponsor-kali-tag.yml @@ -25,7 +25,7 @@ jobs: git config user.email noreply@github.com - uses: actions/setup-node@v6 with: - node-version: 16 + node-version: 20 cache: "yarn" - name: Set application version as variable run: | diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d04644a..2e6b81c2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- Migrated from Vue 2 to Vue 3 +- Migrated from Vuetify 2 to Vuetify 3 +- Replaced vue-beautiful-chat with native Vuetify 3 chat drawer +- Updated CI workflows to Node 20 + ### Added - Added Jobs tab to agent page for viewing and managing background jobs @@ -22,6 +29,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Fixed module execution snackbar displaying "[object Object]" instead of agent name +- Fixed bulk delete on malleable profiles page using wrong identifier ## [3.3.0] - 2026-01-18 diff --git a/package.json b/package.json index 05b45851..b8c725fc 100644 --- a/package.json +++ b/package.json @@ -14,37 +14,35 @@ "dependencies": { "@fontsource/roboto": "^4.5.1", "@fortawesome/fontawesome-free": "^6", - "@mdi/font": "5.9.55", + "@mdi/font": "^7.0", "ansi_up": "^5.2.1", "axios": "^0.24.0", "lodash.debounce": "^4.0.8", "moment": "^2.29.1", "pinia": "^2.1.7", "pinia-plugin-persistedstate": "^3.2.0", - "portal-vue": "^2.1.7", "qs": "^6.10.3", "semver": "^7.3.5", "socket.io-client": "^4.1.2", - "splitpanes": "^2.3.8", + "splitpanes": "^3.1.0", "table": "^6.8.1", "uuid": "^8.3.2", - "vue": "2.7", - "vue-beautiful-chat": "^2.5.0", - "vue-markdown-render": "1.1.2", - "vue-router": "^3.5.1", - "vuedraggable": "^2.24.3", - "vuetify": "^2.6.0" + "vue": "^3.5", + "vue-markdown-render": "^2.3.0", + "vue-router": "^4.3", + "vuedraggable": "^4.1", + "vuetify": "^3.12" }, "devDependencies": { "@rushstack/eslint-patch": "^1.2.0", - "@vitejs/plugin-vue2": "^2.2.0", + "@vitejs/plugin-vue": "^5.0", "@vue/eslint-config-airbnb": "^7.0.0", "eslint": "^8.31.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-vue": "^9.8.0", "prettier": "^3.0.2", - "sass": "~1.32", - "unplugin-vue-components": "^0.22.12", - "vite": "^4" + "sass": "^1.70", + "vite": "^5.0", + "vite-plugin-vuetify": "^2.0" } } diff --git a/src/App.vue b/src/App.vue index 05a4367a..9f6d663b 100644 --- a/src/App.vue +++ b/src/App.vue @@ -5,9 +5,10 @@ - + - +
+
+ + + mdi-chat + + +
- - - @@ -66,7 +81,6 @@ - diff --git a/src/components/ClickToEdit.vue b/src/components/ClickToEdit.vue index 49d5c0d6..8145bfc6 100644 --- a/src/components/ClickToEdit.vue +++ b/src/components/ClickToEdit.vue @@ -2,9 +2,9 @@ {{ label }} - -