Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 21 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [3.5.0] - 2026-04-26

### Changed

- Upgraded Vuetify from v3 to v4
- Migrated deprecated VRow/VCol props (align, justify, dense) to utility classes
- Migrated MD2 typography classes (headline, text-h5, subtitle-1/2) to MD3 equivalents
- Adopted MD3 visual defaults (elevation, density, button styling)
- Improved table UX with row hover highlighting
- Improved Settings page layout with max-width constraint and inner password icons
- Improved empty table state styling
- Improved edit page toolbar button ordering and spacing
- Refined footer, tag chips, and app bar density

### Fixed

- Fixed mass kill action on agents list page not sending kill commands due to incorrect session ID reference

## [3.4.0] - 2026-03-08

### Changed
Expand Down Expand Up @@ -459,7 +477,9 @@ Including but not limited to:

- Initial Release

[Unreleased]: https://github.com/BC-SECURITY/Starkiller-Sponsors/compare/v3.4.0...HEAD
[Unreleased]: https://github.com/BC-SECURITY/Starkiller-Sponsors/compare/v3.5.0...HEAD

[3.5.0]: https://github.com/BC-SECURITY/Starkiller-Sponsors/compare/v3.4.0...v3.5.0

[3.4.0]: https://github.com/BC-SECURITY/Starkiller-Sponsors/compare/v3.3.0...v3.4.0

Expand Down
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "starkiller",
"version": "3.4.0",
"version": "3.5.0",
"private": true,
"scripts": {
"dev": "vite",
Expand Down Expand Up @@ -31,7 +31,7 @@
"vue-markdown-render": "^2.3.0",
"vue-router": "^4.3",
"vuedraggable": "^4.1",
"vuetify": "^3.12"
"vuetify": "^4.0"
},
"devDependencies": {
"@rushstack/eslint-patch": "^1.2.0",
Expand All @@ -43,6 +43,6 @@
"prettier": "^3.0.2",
"sass": "^1.70",
"vite": "^5.0",
"vite-plugin-vuetify": "^2.0"
"vite-plugin-vuetify": "^2.1"
}
}
35 changes: 21 additions & 14 deletions src/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,11 @@
ref="socketNotifications"
/>
<starkiller-snackbar ref="snack" />
<v-app-bar v-if="isLoggedIn" scroll-behavior="elevate">
<v-app-bar
v-if="isLoggedIn"
density="comfortable"
scroll-behavior="elevate"
>
<template
v-if="
$route.name === 'agentEdit' ||
Expand Down Expand Up @@ -48,33 +52,36 @@
</v-container>
</v-main>

<v-footer v-if="!hideSideBar" app>
<span class="mr-2">Copyright (c) 2023 BC Security |</span>
<v-footer
v-if="!hideSideBar"
app
class="text-body-small pa-2 justify-center"
style="font-size: 0.8rem"
>
<span class="mr-1">&copy; 2026 BC Security</span>
<span class="mr-1">&middot;</span>
<a
class="mr-2"
class="mr-1"
target="_blank"
rel="noopener noreferrer"
href="https://github.com/bc-security/starkiller"
>Starkiller</a
>
Starkiller
</a>
<span class="mr-2">|</span>
<span class="mr-1">&middot;</span>
<a
class="mr-2"
class="mr-1"
target="_blank"
rel="noopener noreferrer"
href="https://github.com/bc-security/empire"
>Empire</a
>
Empire</a
>
<span class="mr-2">|</span>
<span class="mr-1">&middot;</span>
<a
class="mr-2"
class="mr-1"
target="_blank"
rel="noopener noreferrer"
href="https://github.com/sponsors/BC-SECURITY"
>
Sponsor for extra features</a
>Sponsor</a
>
</v-footer>
</v-app>
Expand Down
2 changes: 2 additions & 0 deletions src/api/module-api.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,15 @@ export function executeModule(
options,
ignoreAdminCheck,
ignoreLanguageCheck,
backgroundOverride,
) {
return axios
.post(`/agents/${options.Agent}/tasks/module/`, {
module_id: name,
options,
ignore_admin_check: ignoreAdminCheck,
ignore_language_version_check: ignoreLanguageCheck,
background_override: backgroundOverride,
})
.then(({ data }) => ({ agent: options.Agent, ...data }))
.catch((error) =>
Expand Down
8 changes: 8 additions & 0 deletions src/app.scss
Original file line number Diff line number Diff line change
Expand Up @@ -13,3 +13,11 @@
.v-toolbar__extension > div > .v-tabs {
background-color: inherit;
}

// Style empty data table state
.v-data-table-rows-no-data td {
text-align: center;
padding: 48px 16px !important;
color: rgba(255, 255, 255, 0.4);
font-style: italic;
}
2 changes: 1 addition & 1 deletion src/components/AutoRunModules.vue
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@
<v-dialog v-model="showDialog" max-width="600px">
<v-card>
<v-card-title>
<span class="headline">Options</span>
<span class="text-headline-small">Options</span>
</v-card-title>

<v-card-text>
Expand Down
4 changes: 2 additions & 2 deletions src/components/ClickToEdit.vue
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<template>
<v-row class="pb-5">
<v-row class="pb-2">
<v-col cols="4" class="d-flex align-center justify-start">
<span class="text--bold">{{ label }}</span>
<span class="font-weight-bold">{{ label }}</span>
<v-tooltip v-if="infoText" location="bottom">
<template #activator="{ props: activatorProps }">
<v-icon size="small" class="ml-2" v-bind="activatorProps">
Expand Down
2 changes: 1 addition & 1 deletion src/components/DynamicFormInput.vue
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
item-value="id"
item-title="id"
>
<template #item="{ item, props: itemProps }">
<template #item="{ internalItem: item, props: itemProps }">
<v-list-item v-bind="itemProps">
<v-list-item-title>
{{
Expand Down
34 changes: 17 additions & 17 deletions src/components/EditPageTop.vue
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,22 @@
class="mr-4"
>
<slot name="extra-stuff" />
<v-btn
v-if="showCopy && Object.keys(copyLink).length > 0 && !smallCopy"
color="primary"
variant="text"
class="mr-2"
:to="copyLink"
>
{{ copyText }}
<v-icon end> fa-copy </v-icon>
</v-btn>
<tooltip-button
v-else-if="showCopy && Object.keys(copyLink).length > 0 && smallCopy"
icon="fa-copy"
:text="copyText"
:to="copyLink"
/>
<v-btn
v-if="showDelete && !smallDelete"
color="error"
Expand All @@ -25,27 +41,11 @@
:text="deleteText"
@click="$emit('delete')"
/>
<v-btn
v-if="showCopy && Object.keys(copyLink).length > 0 && !smallCopy"
color="primary"
variant="text"
class="mr-2"
:to="copyLink"
>
{{ copyText }}
<v-icon end> fa-copy </v-icon>
</v-btn>
<tooltip-button
v-else-if="showCopy && Object.keys(copyLink).length > 0 && smallCopy"
icon="fa-copy"
:text="copyText"
:to="copyLink"
/>
<v-btn
v-if="showSubmit"
:disabled="disableSubmit"
type="submit"
color="primary"
:color="disableSubmit ? undefined : 'primary'"
:loading="submitLoading"
@click="$emit('submit')"
>
Expand Down
2 changes: 1 addition & 1 deletion src/components/ErrorStateAlert.vue
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<template>
<v-alert prominent type="error">
<v-row align="center">
<v-row class="align-center">
<v-col class="grow">
{{ displayMessage }}
</v-col>
Expand Down
2 changes: 1 addition & 1 deletion src/components/FileUploadDialog.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<v-dialog ref="uploadDialog" v-model="show" max-width="750px">
<v-card>
<v-card-title>
<span class="headline">Upload To Empire Server</span>
<span class="text-headline-small">Upload To Empire Server</span>
</v-card-title>
<v-card-text>
<v-form ref="form" @submit.prevent>
Expand Down
7 changes: 5 additions & 2 deletions src/components/TagChip.vue
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,16 @@
<template #activator="{ props: activatorProps }">
<v-chip
:color="internalTag.color"
class="mt-4 mr-1 ml-1 mb-4 text-white"
class="mt-4 mr-1 ml-1 mb-4"
:class="{ 'text-white': !isNew }"
:variant="isNew ? 'outlined' : 'flat'"
size="small"
:closable="close"
v-bind="activatorProps"
@click:close="deleteTag(internalTag)"
>
{{ `${tag.name}:${tag.value}` }}
<v-icon v-if="customIcon" end>
<v-icon v-if="customIcon" end size="x-small">
{{ customIcon }}
</v-icon>
</v-chip>
Expand Down Expand Up @@ -117,12 +120,12 @@
},
methods: {
deleteTag(tag) {
this.$emit("delete-tag", tag);

Check warning on line 123 in src/components/TagChip.vue

View workflow job for this annotation

GitHub Actions / lint

The "delete-tag" event has been triggered but not declared on `emits` option
},
async updateTag(tag) {
const { valid } = await this.$refs.form.validate();
if (!valid) return;
this.$emit("update-tag", tag);

Check warning on line 128 in src/components/TagChip.vue

View workflow job for this annotation

GitHub Actions / lint

The "update-tag" event has been triggered but not declared on `emits` option
this.menu = false;
this.$refs.form.resetValidation();
},
Expand Down
3 changes: 2 additions & 1 deletion src/components/TooltipButton.vue
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@
:color="flat ? '' : color"
:to="to"
:disabled="disabled"
class="mr-5"
class="mr-2"
icon
variant="text"
:size="xSmall ? 'x-small' : 'small'"
v-bind="activatorProps"
@click="$emit('click')"

Check warning on line 13 in src/components/TooltipButton.vue

View workflow job for this annotation

GitHub Actions / lint

The "click" event has been triggered but not declared on `emits` option
>
<v-icon :style="padLeft !== 0 ? `padding-left: ${padLeft}px` : ''">
{{ icon }} {{ rotate ? "fa-spin" : "" }}
Expand Down
2 changes: 1 addition & 1 deletion src/components/agents/AgentDownloadDialog.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
<v-dialog ref="downloadDialog" v-model="show" max-width="500px">
<v-card>
<v-card-title>
<span class="headline">Download</span>
<span class="text-headline-small">Download</span>
</v-card-title>
<v-card-text>
<v-form ref="form" @submit.prevent>
Expand Down
16 changes: 13 additions & 3 deletions src/components/agents/AgentExecuteModule.vue
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
<v-dialog v-model="showTreeDialog" max-width="500px">
<v-card>
<v-card-title>
<span class="headline">Browse Modules</span>
<span class="text-headline-small">Browse Modules</span>
</v-card-title>
<v-card-text>
<v-treeview
Expand Down Expand Up @@ -80,7 +80,7 @@
</v-dialog>

<v-alert v-if="selectedItem.opsec_safe === false" type="warning">
<v-row align="center">
<v-row class="align-center">
<v-col
class="grow"
style="word-wrap: break-word; word-break: break-word; width: 500px"
Expand All @@ -106,6 +106,12 @@
label="Ignore Language Version Check"
color="primary"
/>
<v-checkbox
v-model="backgroundOverride"
class="pa-1"
label="Run as Background Job"
color="primary"
/>
</div>

<general-form
Expand All @@ -128,7 +134,7 @@
<v-dialog ref="nameDialog" v-model="showDialog" max-width="900px">
<v-card>
<v-card-title>
<span class="headline">Execution Result</span>
<span class="text-headline-small">Execution Result</span>
</v-card-title>
<v-card-text>
<v-data-table
Expand Down Expand Up @@ -227,6 +233,7 @@
errorState: false,
ignoreAdminCheck: false,
ignoreLanguageCheck: false,
backgroundOverride: false,
treeSelected: [],
treeOpen: [],
showTreeDialog: false,
Expand Down Expand Up @@ -401,6 +408,8 @@
this.selectedItem = results || {};
if (!Object.keys(this.selectedItem).length) {
this.errorState = true;
} else {
this.backgroundOverride = !!this.selectedItem.background;
}
},
handleTreeSelect(selected) {
Expand All @@ -418,7 +427,7 @@
return { class: item.status === "rejected" ? "red" : "" };
},
emitModuleChange(newVal) {
this.$emit("moduleChange", newVal);

Check warning on line 430 in src/components/agents/AgentExecuteModule.vue

View workflow job for this annotation

GitHub Actions / lint

The "moduleChange" event has been triggered but not declared on `emits` option
},
async validate() {
return this.$refs.generalform.validate();
Expand All @@ -438,6 +447,7 @@
},
this.ignoreAdminCheck,
this.ignoreLanguageCheck,
this.backgroundOverride,
),
),
);
Expand Down Expand Up @@ -466,7 +476,7 @@
this.snack.info(`Module execution queued for ${displayName}`);
this.selectedItem = {};
this.selectedModule = "";
this.$emit("submitted");

Check warning on line 479 in src/components/agents/AgentExecuteModule.vue

View workflow job for this annotation

GitHub Actions / lint

The "submitted" event has been triggered but not declared on `emits` option
}
this.loading = false;
},
Expand Down
1 change: 0 additions & 1 deletion src/components/agents/AgentJobs.vue
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,6 @@
:items-per-page="10"
item-value="id"
show-expand
class="elevation-1"
no-data-text="No background jobs found. Jobs will appear here when you run modules with Background=true."
>
<template #item.status="{ item }">
Expand Down
Loading
Loading