Compare commits

..
1556 Commits
Author SHA1 Message Date
Cody Thomas 96b24b48a7 Merge pull request #594 from je4yfc/integration
Generalized Support for external services across compose generation and port checks
2026-10-11 10:24:27 -05:00
Cody Thomas bdc722f6ce Merge pull request #589 from mjmaley/fix/cli-pasted-whitespace
Handle pasted whitespace in task arguments
2026-10-08 10:39:11 -05:00
Joseph Erdosy f9e71d0859 feat(cli): generalize external service handling in compose configuration and port checks
Signed-off-by: Joseph Erdosy <[email protected]>
2026-09-10 10:46:37 -04:00
Joseph Erdosy 742d878928 fix(cli): support external Nginx and create config dir for block lists
Signed-off-by: Joseph Erdosy <[email protected]>
2026-09-10 10:46:34 -04:00
Joseph Erdosy 01ea8bc896 feat(database): add external PostgreSQL support and configurable SSL mode (#587, #590)
Signed-off-by: Joseph Erdosy <[email protected]>
2026-09-10 10:46:31 -04:00
pwn 94418bcd52 fix(cli): fail fast on docker-compose failures instead of misleading health loop
The pty path in runDockerCompose returned the (nil) error variable on
nonzero exit, and start() discarded ServiceStart's error. Both together
let 'mythic-cli start' proceed into the UI probe loop after a failed
compose up, ending in os.Exit(1) with unrelated diagnostics (run-1.log).

- dockerComposeManager.runDockerCompose: return a descriptive error on
  nonzero exit in the pty path
- start: log.Fatalf on ServiceStart error so compose failures surface
  immediately

Signed-off-by: Joseph Erdosy <[email protected]>
2026-09-10 10:46:28 -04:00
Cody Thomas 3ae9c5fe18 Merge pull request #593 from je4yfc/cli-error-handling-fixes
fix(cli): fail fast on docker-compose failures in mythic-cli start
2026-09-07 10:57:19 -05:00
pwn 5e85a20d14 fix(cli): fail fast on docker-compose failures instead of misleading health loop
The pty path in runDockerCompose returned the (nil) error variable on
nonzero exit, and start() discarded ServiceStart's error. Both together
let 'mythic-cli start' proceed into the UI probe loop after a failed
compose up, ending in os.Exit(1) with unrelated diagnostics (run-1.log).

- dockerComposeManager.runDockerCompose: return a descriptive error on
  nonzero exit in the pty path
- start: log.Fatalf on ServiceStart error so compose failures surface
  immediately
2026-09-06 14:29:33 -04:00
mjmaley 5f46db6ede Handle pasted whitespace in task arguments 2026-09-02 16:56:36 -04:00
its-a-feature e37e057a89 process browser fix 2026-07-16 13:02:35 -07:00
github-actions 33a46d7db7 Bump Mythic Dockerfile tag to match release 'v3.4.0.61' 2026-07-01 16:06:33 +00:00
its-a-feature 540aec0f00 fixing filtering bug in process browser 2026-07-01 08:45:06 -07:00
github-actions 29be09eef4 Bump Mythic Dockerfile tag to match release 'v3.4.0.60' 2026-06-21 17:04:09 +00:00
its-a-feature a5a1a972d7 updating versioning 2026-06-21 09:09:15 -07:00
its-a-feature 82648e8241 addressing issues #563 #564 and #565 2026-06-21 09:04:45 -07:00
github-actions e4da2c887f Bump Mythic Dockerfile tag to match release 'v3.4.0.59' 2026-06-04 18:25:04 +00:00
Cody Thomas 39f44f7dec Merge pull request #557 from anuj-modi/internal-registry-support
Internal Registry Support
2026-06-04 12:54:16 -05:00
Anuj Modi 0f51584493 add some logs so users know Mirror is configured 2026-05-27 10:35:40 -04:00
Anuj Modi dc50ecc0dc refactor to one variable rather than 2 2026-05-26 16:06:20 -04:00
Anuj Modi 59211a2fbf Add support for Interal Registries for Core images and Agents 2026-05-21 15:46:53 -04:00
its-a-feature f8d355a29c updating single task view 2026-05-07 16:16:32 -05:00
github-actions 1da8fdcd2a Bump Mythic Dockerfile tag to match release 'v3.4.0.58' 2026-05-07 20:08:16 +00:00
its-a-feature 2dcc3b5699 fixing lazyQuery on single task view page 2026-05-07 14:47:22 -05:00
Cody Thomas 8deec59270 Merge pull request #548 from s1nc3ju1y/fix-jupyter-port-env
Pass JUPYTER_PORT into mythic_jupyter container
2026-04-28 13:58:22 -05:00
s1nc3ju1y 071abeaf74 Pass JUPYTER_PORT into mythic_jupyter container 2026-04-28 19:32:05 +08:00
its-a-feature 6eb53da6b5 slight UI updates, additional color choice added, some formatting 2026-04-16 17:39:11 -05:00
github-actions d605a2f82c Bump Mythic Dockerfile tag to match release 'v3.4.0.57' 2026-04-16 13:28:59 +00:00
its-a-feature 31db999945 updating version and readme 2026-04-16 08:07:33 -05:00
Cody Thomas 9ae193be76 Merge pull request #546 from Kargha/fix-missing-return-apitokengen
fix missing return in GenerateAPITokenWebhook
2026-04-16 07:59:01 -05:00
Andreas Persson fc731af819 fix missing return in GenerateAPITokenWebhook 2026-04-16 12:17:38 +09:00
Cody Thomas d21dbf293b Merge pull request #541 from its-a-feature/dependabot/go_modules/Mythic_CLI/src/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp-1.43.0
Bump go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp from 1.25.0 to 1.43.0 in /Mythic_CLI/src
2026-04-15 16:13:55 -05:00
dependabot[bot] b6d98b1794 Bump go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp
Bumps [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp](https://github.com/open-telemetry/opentelemetry-go) from 1.25.0 to 1.43.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.25.0...v1.43.0)

---
updated-dependencies:
- dependency-name: go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp
  dependency-version: 1.43.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-04-15 21:11:32 +00:00
Cody Thomas 448a57b82b Merge pull request #542 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/lodash-4.18.1
Bump lodash from 4.17.23 to 4.18.1 in /MythicReactUI
2026-04-15 16:10:35 -05:00
Cody Thomas 1d54d5ea0c Merge pull request #543 from its-a-feature/dependabot/go_modules/Mythic_CLI/src/go.opentelemetry.io/otel/sdk-1.43.0
Bump go.opentelemetry.io/otel/sdk from 1.42.0 to 1.43.0 in /Mythic_CLI/src
2026-04-15 16:10:14 -05:00
Cody Thomas 4d793d5998 Merge pull request #544 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/follow-redirects-1.16.0
Bump follow-redirects from 1.15.9 to 1.16.0 in /MythicReactUI
2026-04-15 16:09:29 -05:00
its-a-feature 60455c26cb add mythic server name to emitted log messages 2026-04-15 08:34:52 -05:00
Cody Thomas 183f0605c2 Merge pull request #545 from Kargha/fix-emit-task-log-operation-id
Fix OperationID always being 0 in emitTaskLog
2026-04-15 08:20:36 -05:00
Andreas Persson 37d3cc8b1b Fix OperationID always being 0 in emitTaskLog 2026-04-15 21:26:48 +09:00
dependabot[bot] 9532b96f7a Bump follow-redirects from 1.15.9 to 1.16.0 in /MythicReactUI
Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.9 to 1.16.0.
- [Release notes](https://github.com/follow-redirects/follow-redirects/releases)
- [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.9...v1.16.0)

---
updated-dependencies:
- dependency-name: follow-redirects
  dependency-version: 1.16.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-04-15 11:12:15 +00:00
its-a-feature e1806f0fd5 updating event log message handling for performance updates 2026-04-13 09:08:13 -05:00
github-actions fa235b6378 Bump Mythic Dockerfile tag to match release 'v3.4.0.56' 2026-04-10 15:36:04 +00:00
its-a-feature b87219b1e9 updating c2 profile build to leverage ui_position specifications 2026-04-10 10:14:05 -05:00
github-actions b5459b56c8 Bump Mythic Dockerfile tag to match release 'v3.4.0.55' 2026-04-10 14:57:33 +00:00
its-a-feature ca6d7d2ce0 fixed an issue with database connection exhaustion on errors 2026-04-10 09:35:59 -05:00
github-actions 6148c5f0fb Bump Mythic Dockerfile tag to match release 'v3.4.0.54' 2026-04-10 13:42:54 +00:00
its-a-feature 6e14b2a472 updating postgres healthcheck 2026-04-10 08:21:55 -05:00
dependabot[bot] 307df57df8 Bump go.opentelemetry.io/otel/sdk in /Mythic_CLI/src
Bumps [go.opentelemetry.io/otel/sdk](https://github.com/open-telemetry/opentelemetry-go) from 1.42.0 to 1.43.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.42.0...v1.43.0)

---
updated-dependencies:
- dependency-name: go.opentelemetry.io/otel/sdk
  dependency-version: 1.43.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-04-08 20:27:11 +00:00
dependabot[bot] 4a4d95f1ca Bump lodash from 4.17.23 to 4.18.1 in /MythicReactUI
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.23 to 4.18.1.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.23...4.18.1)

---
updated-dependencies:
- dependency-name: lodash
  dependency-version: 4.18.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-04-08 20:23:39 +00:00
github-actions ffc5041349 Bump Mythic Dockerfile tag to match release 'v3.4.0.53' 2026-04-06 21:49:43 +00:00
its-a-feature ecda245963 updating version tracking for merged PR 2026-04-06 16:27:36 -05:00
Cody Thomas 6ea67c69b9 Merge pull request #539 from nt0xa/auth_acs-get-handler
GET request handler for /auth_acs/:containerName/:IDPName
2026-04-06 16:25:10 -05:00
Anton Prokhorov 64d32eb116 GET request handler for /auth_acs/:containerName/:IDPName 2026-04-06 22:11:22 +01:00
Cody Thomas 9f7a1ce770 Merge pull request #537 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/node-forge-1.4.0
Bump node-forge from 1.3.2 to 1.4.0 in /MythicReactUI
2026-03-27 13:40:12 -05:00
dependabot[bot] 4a3818988c Bump node-forge from 1.3.2 to 1.4.0 in /MythicReactUI
Bumps [node-forge](https://github.com/digitalbazaar/forge) from 1.3.2 to 1.4.0.
- [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md)
- [Commits](https://github.com/digitalbazaar/forge/compare/v1.3.2...v1.4.0)

---
updated-dependencies:
- dependency-name: node-forge
  dependency-version: 1.4.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-03-27 18:39:09 +00:00
Cody Thomas 1ec6318b62 Merge pull request #536 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/picomatch-2.3.2
Bump picomatch from 2.3.1 to 2.3.2 in /MythicReactUI
2026-03-27 13:38:39 -05:00
Cody Thomas 60902a6e66 Merge pull request #535 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/multi-c136cad177
Bump yaml in /MythicReactUI
2026-03-27 13:38:11 -05:00
dependabot[bot] ddda1a266c Bump picomatch from 2.3.1 to 2.3.2 in /MythicReactUI
Bumps [picomatch](https://github.com/micromatch/picomatch) from 2.3.1 to 2.3.2.
- [Release notes](https://github.com/micromatch/picomatch/releases)
- [Changelog](https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/picomatch/compare/2.3.1...2.3.2)

---
updated-dependencies:
- dependency-name: picomatch
  dependency-version: 2.3.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-03-25 22:25:24 +00:00
dependabot[bot] 8dc9f351d9 Bump yaml in /MythicReactUI
Bumps  and [yaml](https://github.com/eemeli/yaml). These dependencies needed to be updated together.

Updates `yaml` from 1.10.2 to 1.10.3
- [Release notes](https://github.com/eemeli/yaml/releases)
- [Commits](https://github.com/eemeli/yaml/compare/v1.10.2...v1.10.3)

Updates `yaml` from 2.7.1 to 2.8.3
- [Release notes](https://github.com/eemeli/yaml/releases)
- [Commits](https://github.com/eemeli/yaml/compare/v1.10.2...v1.10.3)

---
updated-dependencies:
- dependency-name: yaml
  dependency-version: 1.10.3
  dependency-type: indirect
- dependency-name: yaml
  dependency-version: 2.8.3
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-03-25 20:21:11 +00:00
github-actions d7b4d51186 Bump Mythic Dockerfile tag to match release 'v3.4.0.52' 2026-03-24 13:42:04 +00:00
its-a-feature d2334b79de bumping dependencies 2026-03-24 08:20:20 -05:00
Cody Thomas 96df4db36e Merge pull request #534 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/jsonpath-1.3.0
Bump jsonpath from 1.2.1 to 1.3.0 in /MythicReactUI
2026-03-24 08:09:35 -05:00
dependabot[bot] a72dd1b086 Bump jsonpath from 1.2.1 to 1.3.0 in /MythicReactUI
Bumps [jsonpath](https://github.com/dchester/jsonpath) from 1.2.1 to 1.3.0.
- [Commits](https://github.com/dchester/jsonpath/commits)

---
updated-dependencies:
- dependency-name: jsonpath
  dependency-version: 1.3.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-03-24 13:08:48 +00:00
Cody Thomas 89bee21894 Merge pull request #529 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/flatted-3.4.2
Bump flatted from 3.3.3 to 3.4.2 in /MythicReactUI
2026-03-24 08:08:11 -05:00
Cody Thomas 26a4410f0a Merge pull request #527 from its-a-feature/dependabot/go_modules/mythic-docker/src/google.golang.org/grpc-1.79.3
Bump google.golang.org/grpc from 1.79.2 to 1.79.3 in /mythic-docker/src
2026-03-24 08:07:51 -05:00
github-actions 36fb4c58bf Bump Mythic Dockerfile tag to match release 'v3.4.0.51' 2026-03-23 15:30:55 +00:00
its-a-feature cfdf0c537d Merge remote-tracking branch 'origin/master' 2026-03-23 10:09:04 -05:00
its-a-feature f23e123a56 fixing file browser bug, upload bug, and file removal bug 2026-03-23 10:08:57 -05:00
github-actions 5b4c210e6f Bump Mythic Dockerfile tag to match release 'v3.4.0.50' 2026-03-23 14:06:16 +00:00
its-a-feature 3dee8797da updating to fix file click issue 2026-03-21 14:53:40 -05:00
dependabot[bot] 33f48baab4 Bump flatted from 3.3.3 to 3.4.2 in /MythicReactUI
Bumps [flatted](https://github.com/WebReflection/flatted) from 3.3.3 to 3.4.2.
- [Commits](https://github.com/WebReflection/flatted/compare/v3.3.3...v3.4.2)

---
updated-dependencies:
- dependency-name: flatted
  dependency-version: 3.4.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-03-21 10:30:41 +00:00
github-actions 3198f304c3 Bump Mythic Dockerfile tag to match release 'v3.4.0.49' 2026-03-20 23:03:14 +00:00
its-a-feature 09ac733d45 UI updates and back-end better file transfer tracking 2026-03-20 17:27:25 -05:00
its-a-feature 3e611494cc First set of draggable modals to access content behind them 2026-03-19 19:05:33 -05:00
dependabot[bot] 8be3c084e5 Bump google.golang.org/grpc from 1.79.2 to 1.79.3 in /mythic-docker/src
Bumps [google.golang.org/grpc](https://github.com/grpc/grpc-go) from 1.79.2 to 1.79.3.
- [Release notes](https://github.com/grpc/grpc-go/releases)
- [Commits](https://github.com/grpc/grpc-go/compare/v1.79.2...v1.79.3)

---
updated-dependencies:
- dependency-name: google.golang.org/grpc
  dependency-version: 1.79.3
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-03-19 02:35:13 +00:00
github-actions 3796640835 Bump Mythic Dockerfile tag to match release 'v3.4.0.48' 2026-03-18 20:17:23 +00:00
its-a-feature 6e23b29f22 tweaking how MythicRPCFileSearch works to prevent duplicates 2026-03-18 14:55:38 -05:00
github-actions 22e5c489b2 Bump Mythic Dockerfile tag to match release 'v3.4.0.47' 2026-03-17 17:18:52 +00:00
its-a-feature 8cdf34c3e7 fixing bug with file uploads in recreated build parameters 2026-03-17 11:22:41 -05:00
its-a-feature b285558fce fixing bug with nil path for screenshots 2026-03-17 08:26:34 -05:00
its-a-feature e536f59347 updating mythic-cli go docker version 2026-03-17 07:57:54 -05:00
its-a-feature 4c472f7e3a updating go modules for mythic_server and mythic-cli 2026-03-16 14:31:34 -05:00
Cody Thomas cc77f2b1a3 Merge pull request #525 from its-a-feature/dependabot/go_modules/Mythic_CLI/src/golang.org/x/net-0.38.0
Bump golang.org/x/net from 0.28.0 to 0.38.0 in /Mythic_CLI/src
2026-03-16 09:58:23 -05:00
dependabot[bot] 1c18703e96 Bump golang.org/x/net from 0.28.0 to 0.38.0 in /Mythic_CLI/src
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.28.0 to 0.38.0.
- [Commits](https://github.com/golang/net/compare/v0.28.0...v0.38.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-version: 0.38.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-03-16 14:57:34 +00:00
Cody Thomas f017661b3d Merge pull request #520 from its-a-feature/dependabot/go_modules/Mythic_CLI/src/go.opentelemetry.io/otel/sdk-1.40.0
Bump go.opentelemetry.io/otel/sdk from 1.25.0 to 1.40.0 in /Mythic_CLI/src
2026-03-16 09:56:49 -05:00
Cody Thomas 98dd30d984 Merge pull request #501 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/multi-75e6bc5210
Bump js-yaml in /MythicReactUI
2026-03-16 09:55:30 -05:00
Cody Thomas eb3cf1053b Merge pull request #524 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/multi-b5ddb13e79
Bump react-router and react-router-dom in /MythicReactUI
2026-03-16 09:54:19 -05:00
Cody Thomas 58e2c6de5f Merge pull request #522 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/ajv-6.14.0
Bump ajv from 6.12.6 to 6.14.0 in /MythicReactUI
2026-03-16 09:53:17 -05:00
Cody Thomas 7dc66c43aa Merge pull request #521 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/rollup-2.80.0
Bump rollup from 2.79.2 to 2.80.0 in /MythicReactUI
2026-03-16 09:52:53 -05:00
dependabot[bot] 9c6afe2d8c Bump react-router and react-router-dom in /MythicReactUI
Bumps [react-router](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router) to 7.13.1 and updates ancestor dependency [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom). These dependencies need to be updated together.


Updates `react-router` from 7.5.2 to 7.13.1
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/[email protected]/packages/react-router)

Updates `react-router-dom` from 7.5.2 to 7.13.1
- [Release notes](https://github.com/remix-run/react-router/releases)
- [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md)
- [Commits](https://github.com/remix-run/react-router/commits/[email protected]/packages/react-router-dom)

---
updated-dependencies:
- dependency-name: react-router
  dependency-version: 7.13.1
  dependency-type: indirect
- dependency-name: react-router-dom
  dependency-version: 7.13.1
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-03-16 14:50:21 +00:00
dependabot[bot] 6c5b1d2a24 Bump ajv from 6.12.6 to 6.14.0 in /MythicReactUI
Bumps [ajv](https://github.com/ajv-validator/ajv) from 6.12.6 to 6.14.0.
- [Release notes](https://github.com/ajv-validator/ajv/releases)
- [Commits](https://github.com/ajv-validator/ajv/compare/v6.12.6...v6.14.0)

---
updated-dependencies:
- dependency-name: ajv
  dependency-version: 6.14.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-03-16 14:50:01 +00:00
dependabot[bot] fc8239eb85 Bump rollup from 2.79.2 to 2.80.0 in /MythicReactUI
Bumps [rollup](https://github.com/rollup/rollup) from 2.79.2 to 2.80.0.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/v2.80.0/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v2.79.2...v2.80.0)

---
updated-dependencies:
- dependency-name: rollup
  dependency-version: 2.80.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-03-16 14:49:56 +00:00
Cody Thomas 180c6e1914 Merge pull request #511 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/lodash-4.17.23
Bump lodash from 4.17.21 to 4.17.23 in /MythicReactUI
2026-03-16 09:49:35 -05:00
Cody Thomas 59c97d791f Merge pull request #523 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/multi-ca49cfd856
Bump minimatch in /MythicReactUI
2026-03-16 09:49:10 -05:00
Cody Thomas d9e1d5e6bd Merge pull request #497 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/node-forge-1.3.2
Bump node-forge from 1.3.1 to 1.3.2 in /MythicReactUI
2026-03-16 09:48:47 -05:00
Cody Thomas 0f5746b4a3 Merge pull request #514 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/webpack-5.105.0
Bump webpack from 5.99.6 to 5.105.0 in /MythicReactUI
2026-03-16 09:48:27 -05:00
dependabot[bot] 71c03251fb Bump minimatch in /MythicReactUI
Bumps  and [minimatch](https://github.com/isaacs/minimatch). These dependencies needed to be updated together.

Updates `minimatch` from 3.1.2 to 3.1.5
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v3.1.2...v3.1.5)

Updates `minimatch` from 9.0.5 to 9.0.9
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v3.1.2...v3.1.5)

Updates `minimatch` from 5.1.6 to 5.1.9
- [Changelog](https://github.com/isaacs/minimatch/blob/main/changelog.md)
- [Commits](https://github.com/isaacs/minimatch/compare/v3.1.2...v3.1.5)

---
updated-dependencies:
- dependency-name: minimatch
  dependency-version: 3.1.5
  dependency-type: indirect
- dependency-name: minimatch
  dependency-version: 9.0.9
  dependency-type: indirect
- dependency-name: minimatch
  dependency-version: 5.1.9
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-03-16 14:48:19 +00:00
dependabot[bot] f742ab3d0f Bump go.opentelemetry.io/otel/sdk in /Mythic_CLI/src
Bumps [go.opentelemetry.io/otel/sdk](https://github.com/open-telemetry/opentelemetry-go) from 1.25.0 to 1.40.0.
- [Release notes](https://github.com/open-telemetry/opentelemetry-go/releases)
- [Changelog](https://github.com/open-telemetry/opentelemetry-go/blob/main/CHANGELOG.md)
- [Commits](https://github.com/open-telemetry/opentelemetry-go/compare/v1.25.0...v1.40.0)

---
updated-dependencies:
- dependency-name: go.opentelemetry.io/otel/sdk
  dependency-version: 1.40.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-03-16 14:48:09 +00:00
Cody Thomas d3ae12a220 Merge pull request #515 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/jsonpath-1.2.1
Bump jsonpath from 1.1.1 to 1.2.1 in /MythicReactUI
2026-03-16 09:47:31 -05:00
Cody Thomas d9a41572ac Merge pull request #517 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/multi-a07fd7252a
Bump qs and express in /MythicReactUI
2026-03-16 09:47:07 -05:00
github-actions e454531999 Bump Mythic Dockerfile tag to match release 'v3.4.0.46' 2026-03-16 14:45:43 +00:00
its-a-feature 45cf6a9cd8 fixing bug from bad staging 2026-03-16 09:24:21 -05:00
github-actions 5011314ba5 Bump Mythic Dockerfile tag to match release 'v3.4.0.45' 2026-03-12 20:32:09 +00:00
its-a-feature af9d3c40e6 fixing callback imports and scrolling pages/tabs 2026-03-12 15:12:15 -05:00
github-actions 03e27abdb6 Bump Mythic Dockerfile tag to match release 'v3.4.0.44' 2026-03-05 00:04:17 +00:00
its-a-feature e7fde3fcde adding burst reads to rpfwd 2026-03-04 17:44:44 -06:00
its-a-feature 51c0eeb5df updating readme 2026-02-19 12:43:57 -06:00
github-actions 0f259d1f7d Bump Mythic Dockerfile tag to match release 'v3.4.0.43' 2026-02-19 17:38:14 +00:00
its-a-feature d86f0d6227 fixing ui bug with database query on file preview 2026-02-19 11:18:42 -06:00
its-a-feature 3bb93efa72 pushC2 and proxy updates 2026-02-18 13:53:14 -06:00
Cody Thomas 652234d7e1 Merge pull request #516 from CCob/grpc-corruption
This PR fixes a PushC2 gRPC stream corruption problem when SOCKS traffic creates heavy load
2026-02-16 09:33:56 -06:00
dependabot[bot] 44d8fd168e Bump qs and express in /MythicReactUI
Bumps [qs](https://github.com/ljharb/qs) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `qs` from 6.13.0 to 6.14.2
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.13.0...v6.14.2)

Updates `express` from 4.21.2 to 4.22.1
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/v4.22.1/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.21.2...v4.22.1)

---
updated-dependencies:
- dependency-name: qs
  dependency-version: 6.14.2
  dependency-type: indirect
- dependency-name: express
  dependency-version: 4.22.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-02-14 03:50:56 +00:00
Ceri Coburn 2e418bbb4d Increase the per agent C2 channel message queue to 1000 to reduce the chances of a full queue under load 2026-02-13 13:01:14 +00:00
Ceri Coburn 87249b2891 Fail immediately and drop SOCKS messages when the gRPC channel is full
The previous wait for 10s will block ALL SOCKS packets across ALL agents due to a single agents full push queue. This is due to the synchronous nature of interceptProxyDataToAgentForPushC2. If we drop immediately due to a single busy/slow agent , we don't affect the others.
2026-02-13 13:00:31 +00:00
Ceri Coburn dbb15fdbb3 Put a mutex around stream.Send
Since stream.Send is called within an async goroutine and in the outer StartPushC2Streaming method, this can cause corruption on the gRPC stream since two sends can potentially be sent at the same time during heavy load
2026-02-13 12:56:38 +00:00
dependabot[bot] 04ebb6aba7 Bump jsonpath from 1.1.1 to 1.2.1 in /MythicReactUI
Bumps [jsonpath](https://github.com/dchester/jsonpath) from 1.1.1 to 1.2.1.
- [Commits](https://github.com/dchester/jsonpath/commits/1.2.1)

---
updated-dependencies:
- dependency-name: jsonpath
  dependency-version: 1.2.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-02-12 15:31:41 +00:00
github-actions 8a2e42c48c Bump Mythic Dockerfile tag to match release 'v3.4.0.42' 2026-02-10 15:37:16 +00:00
its-a-feature db682d5020 updating file/process browser improvements 2026-02-10 09:17:14 -06:00
dependabot[bot] 6649279e3e Bump webpack from 5.99.6 to 5.105.0 in /MythicReactUI
Bumps [webpack](https://github.com/webpack/webpack) from 5.99.6 to 5.105.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Changelog](https://github.com/webpack/webpack/blob/main/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack/compare/v5.99.6...v5.105.0)

---
updated-dependencies:
- dependency-name: webpack
  dependency-version: 5.105.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-02-07 14:17:12 +00:00
github-actions 6d1778bb3b Bump Mythic Dockerfile tag to match release 'v3.4.0.41' 2026-02-06 14:44:14 +00:00
its-a-feature 0484154eae few UI and back-end fixes 2026-02-06 08:24:31 -06:00
github-actions 99f2b6cb2f Bump Mythic Dockerfile tag to match release 'v3.4.0.40' 2026-02-02 23:31:17 +00:00
its-a-feature 303741ee28 updating browser script table sorting 2026-02-02 14:24:57 -06:00
github-actions 37a3f66d68 Bump Mythic Dockerfile tag to match release 'v3.4.0.39' 2026-02-02 17:58:58 +00:00
its-a-feature 8e43275c27 p2p fixes and building/c2 syncing fixes 2026-02-02 11:39:44 -06:00
github-actions 6dfe40b274 Bump Mythic Dockerfile tag to match release 'v3.4.0.38' 2026-01-30 13:46:45 +00:00
its-a-feature 49e1c62502 adding supported_ui_feature of file_browser:remove_folder 2026-01-30 07:28:00 -06:00
github-actions a739837c95 Bump Mythic Dockerfile tag to match release 'v3.4.0.37' 2026-01-29 22:21:24 +00:00
its-a-feature 063f70a55d updating Mythic UI to add in tabs browser script option 2026-01-29 16:02:06 -06:00
github-actions fb6c3d8368 Bump Mythic Dockerfile tag to match release 'v3.4.0.36' 2026-01-27 19:39:24 +00:00
its-a-feature 10f0eb9e7a fix for UI caching bug in split tasking view 2026-01-27 13:20:15 -06:00
dependabot[bot] afdd0ec9cc Bump lodash from 4.17.21 to 4.17.23 in /MythicReactUI
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.21 to 4.17.23.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.21...4.17.23)

---
updated-dependencies:
- dependency-name: lodash
  dependency-version: 4.17.23
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2026-01-21 23:47:42 +00:00
github-actions 2391244baa Bump Mythic Dockerfile tag to match release 'v3.4.0.35' 2026-01-14 22:51:11 +00:00
its-a-feature 9e0fbcfa3a more UI config options and a UI streaming update fix 2026-01-14 16:31:48 -06:00
github-actions 54e6cc5d32 Bump Mythic Dockerfile tag to match release 'v3.4.0.34' 2026-01-09 19:14:06 +00:00
its-a-feature c56d92ee52 UI fix for dynamic query parameters 2026-01-09 10:53:35 -08:00
github-actions 706e8d3ce7 Bump Mythic Dockerfile tag to match release 'v3.4.0.33' 2026-01-09 05:39:11 +00:00
its-a-feature 29e57f1384 Fixing UI bug with C2 deviations 2026-01-08 21:20:13 -08:00
its-a-feature bf7de9ad22 adjust docker health check start times 2026-01-04 08:31:28 -06:00
github-actions e3cbdd35e7 Bump Mythic Dockerfile tag to match release 'v3.4.0.32' 2026-01-02 17:19:53 +00:00
its-a-feature 2ca4ad507e updating jupyter and container orders 2026-01-02 10:51:56 -06:00
github-actions 43a8a8580c Bump Mythic Dockerfile tag to match release 'v3.4.0.31' 2026-01-01 16:08:13 +00:00
its-a-feature fd02fe2c9e adding more scripting examples to command info 2026-01-01 09:49:30 -06:00
github-actions 3a6d9c4842 Bump Mythic Dockerfile tag to match release 'v3.4.0.30' 2025-12-31 20:15:39 +00:00
its-a-feature 31e297a37f fixing UI bugs, remove dangling images in docker by default, skip steps 2025-12-31 13:54:23 -06:00
its-a-feature b40aed02b8 fixing some UI issues 2025-12-29 11:41:52 -06:00
github-actions 5e031f64b2 Bump Mythic Dockerfile tag to match release 'v3.4.0.29' 2025-12-23 21:43:19 +00:00
its-a-feature f6532b127d updating processing for file chunked browser data 2025-12-23 15:23:43 -06:00
github-actions a383fcf8c5 Bump Mythic Dockerfile tag to match release 'v3.4.0.28' 2025-12-23 16:19:35 +00:00
its-a-feature 307eb0dd72 fixing file browser bug 2025-12-23 10:00:23 -06:00
github-actions 29db86be7c Bump Mythic Dockerfile tag to match release 'v3.4.0.27' 2025-12-23 14:21:51 +00:00
its-a-feature 04be0065f3 fixing issue with cron parsing 2025-12-23 08:02:57 -06:00
github-actions 8601357379 Bump Mythic Dockerfile tag to match release 'v3.4.0.26' 2025-12-22 20:23:57 +00:00
its-a-feature bb3a4b2294 fixing syncing bug with translation containers 2025-12-22 14:05:05 -06:00
github-actions 44149bdf2b Bump Mythic Dockerfile tag to match release 'v3.4.0.25' 2025-12-18 20:26:47 +00:00
its-a-feature 1a2bf56c8c adding more database triggers for updating timestamps 2025-12-18 14:07:56 -06:00
github-actions 63867bc27a Bump Mythic Dockerfile tag to match release 'v3.4.0.24' 2025-12-15 20:29:10 +00:00
its-a-feature 42a7869750 updating default UI and change to RPC Task Create 2025-12-15 14:08:09 -06:00
github-actions 8479a2d091 Bump Mythic Dockerfile tag to match release 'v3.4.0.23' 2025-12-11 17:42:46 +00:00
its-a-feature c7357c6fee updating custom browser functionality 2025-12-11 11:23:57 -06:00
github-actions e6fd09b069 Bump Mythic Dockerfile tag to match release 'v3.4.0.22' 2025-12-10 20:42:36 +00:00
its-a-feature 8cc47d518e updating UI side bar ordering of CSS 2025-12-10 14:17:54 -06:00
github-actions ae2ed75801 Bump Mythic Dockerfile tag to match release 'v3.4.0.21' 2025-12-10 19:40:46 +00:00
dependabot[bot] 7f225e51f1 Bump js-yaml in /MythicReactUI
Bumps  and [js-yaml](https://github.com/nodeca/js-yaml). These dependencies needed to be updated together.

Updates `js-yaml` from 3.14.1 to 3.14.2
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/3.14.1...3.14.2)

Updates `js-yaml` from 4.1.0 to 4.1.1
- [Changelog](https://github.com/nodeca/js-yaml/blob/master/CHANGELOG.md)
- [Commits](https://github.com/nodeca/js-yaml/compare/3.14.1...3.14.2)

---
updated-dependencies:
- dependency-name: js-yaml
  dependency-version: 3.14.2
  dependency-type: indirect
- dependency-name: js-yaml
  dependency-version: 4.1.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2025-12-10 19:22:35 +00:00
Cody Thomas c173f083dd Merge pull request #500 from its-a-feature/custombrowser
Custombrowser
2025-12-10 13:21:32 -06:00
its-a-feature 3e3356e586 updating changelog 2025-12-10 13:21:04 -06:00
its-a-feature 70a4ca26ec adding changelog 2025-12-10 13:17:15 -06:00
its-a-feature 64fd83b999 adding vhost options 2025-12-10 12:03:49 -06:00
its-a-feature 180a81111d adding in mythic_vhost 2025-12-10 11:55:23 -06:00
its-a-feature 767881fd6c updating container version semver to be more explicit 2025-12-10 09:49:14 -06:00
its-a-feature 4240722b3a updated changelog/readme 2025-12-10 09:16:57 -06:00
its-a-feature 36ceaaacba custom browser update 2025-12-10 08:20:43 -06:00
dependabot[bot] bf22f85661 Bump node-forge from 1.3.1 to 1.3.2 in /MythicReactUI
Bumps [node-forge](https://github.com/digitalbazaar/forge) from 1.3.1 to 1.3.2.
- [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md)
- [Commits](https://github.com/digitalbazaar/forge/compare/v1.3.1...v1.3.2)

---
updated-dependencies:
- dependency-name: node-forge
  dependency-version: 1.3.2
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2025-11-26 22:19:13 +00:00
github-actions e7405bd62c Bump Mythic Dockerfile tag to match release 'v3.4.0.20' 2025-11-10 16:21:53 +00:00
its-a-feature 2ab6e20162 updated ui to fix bug with no c2 profile 2025-11-10 10:01:34 -06:00
github-actions 274e41f1ee Bump Mythic Dockerfile tag to match release 'v3.4.0.19' 2025-10-31 14:56:43 +00:00
its-a-feature 3748d68f2e fix for c2 logo tracking 2025-10-31 09:36:32 -05:00
github-actions e8efb8acea Bump Mythic Dockerfile tag to match release 'v3.4.0.18' 2025-10-30 16:59:53 +00:00
its-a-feature 438bbf1b3d fixing eventing bug 2025-10-30 11:40:12 -05:00
its-a-feature 5812391061 updating readme badges 2025-10-30 10:20:24 -05:00
github-actions 07e6bedf71 Bump Mythic Dockerfile tag to match release 'v3.4.0.17' 2025-10-29 14:31:55 +00:00
its-a-feature 1966848577 adding two new MythicRPC endpoints 2025-10-29 08:33:56 -05:00
github-actions 3953850496 Bump Mythic Dockerfile tag to match release 'v3.4.0.16' 2025-10-28 19:31:10 +00:00
its-a-feature aa1de9ef14 fixing UI bug for hidden parameters 2025-10-28 14:11:36 -05:00
github-actions 7dd545fb9d Bump Mythic Dockerfile tag to match release 'v3.4.0.15' 2025-10-28 15:18:02 +00:00
its-a-feature c997ab3a8b updating migrations 2025-10-28 09:56:59 -05:00
its-a-feature 7e95ae879d updating migrations 2025-10-28 09:45:05 -05:00
its-a-feature 5d4c173099 updating mythic-cli version 2025-10-28 09:33:52 -05:00
Cody Thomas 8095eee496 Merge pull request #489 from Norton1999/master
fix when installLocation is an ssh link
2025-10-28 09:32:20 -05:00
its-a-feature 9ed4a8ee49 new build ordering and dynamic functions 2025-10-28 09:31:32 -05:00
github-actions 520e3a94ca Bump Mythic Dockerfile tag to match release 'v3.4.0.14' 2025-10-16 21:20:48 +00:00
its-a-feature 9a44032528 forgot to update the version 2025-10-16 23:01:02 +02:00
its-a-feature df8b903757 fixing selection bug 2025-10-16 22:56:42 +02:00
github-actions 3a814eca14 Bump Mythic Dockerfile tag to match release 'v3.4.0.13' 2025-10-16 20:41:50 +00:00
its-a-feature d169ee834e Merge remote-tracking branch 'origin/master' 2025-10-16 22:19:04 +02:00
its-a-feature c7dab9a565 fixing a UI bug for CLI quotes and file browser permissions display 2025-10-16 22:19:00 +02:00
github-actions 1e0202eaba Bump Mythic Dockerfile tag to match release 'v3.4.0.12' 2025-10-16 09:38:47 +00:00
its-a-feature 405f58c68e fixing bug with dictionary c2 deviations in scripting defaults 2025-10-16 11:16:12 +02:00
its-a-feature ba593a8f94 fixing issue with filtered command attributes in task modals 2025-10-16 04:21:53 +02:00
github-actions ebf6425fd9 Bump Mythic Dockerfile tag to match release 'v3.4.0.11' 2025-10-16 02:00:01 +00:00
its-a-feature 8903cf243a fixing an issue with generating api tokens 2025-10-16 03:40:45 +02:00
Nellie 6333fef797 fix when installLocation is an ssh link 2025-10-15 18:21:58 -07:00
github-actions cf557df672 Bump Mythic Dockerfile tag to match release 'v3.4.0.10' 2025-10-13 20:14:12 +00:00
its-a-feature c2bbc061bf fixing an issue with callbackgraph searching 2025-10-13 14:53:20 -05:00
github-actions af5f4416a6 Bump Mythic Dockerfile tag to match release 'v3.4.0.9' 2025-10-13 14:27:30 +00:00
its-a-feature 0692cad336 fixing dictionary parameter deviations 2025-10-13 09:07:46 -05:00
github-actions e244f9fcd1 Bump Mythic Dockerfile tag to match release 'v3.4.0.8' 2025-10-11 15:31:01 +00:00
its-a-feature dd8c548242 UI fixes for files/booleans with payloads 2025-10-11 10:11:56 -05:00
github-actions 137b5cc4a1 Bump Mythic Dockerfile tag to match release 'v3.4.0.7' 2025-10-10 17:04:33 +00:00
its-a-feature 92f3ee46b6 updating jupyter pypi scripting to 0.2.10 2025-10-10 11:44:33 -05:00
github-actions 8979bd1f42 Bump Mythic Dockerfile tag to match release 'v3.4.0.6' 2025-10-10 16:10:45 +00:00
its-a-feature 46abe5a032 few small bug fixes 2025-10-10 10:49:22 -05:00
github-actions b294c8ff53 Bump Mythic Dockerfile tag to match release 'v3.4.0.5' 2025-10-09 16:38:29 +00:00
its-a-feature 11ab25a74e fixing linking/tagging bugs and updating golang json 2025-10-09 10:01:51 -05:00
github-actions 33d0e0b7a3 Bump Mythic Dockerfile tag to match release 'v3.4.0.3' 2025-10-08 22:02:10 +00:00
its-a-feature 48c77ed20b few UI fixes for payload builds 2025-10-08 16:42:27 -05:00
github-actions 64828ca26e Bump Mythic Dockerfile tag to match release 'v3.4.0.2' 2025-10-07 23:35:23 +00:00
its-a-feature 96231b6f5e updating ui for better icon placement for c2 profiles 2025-10-07 18:16:07 -05:00
github-actions f1c1ceca91 Bump Mythic Dockerfile tag to match release 'v3.4.0.1' 2025-10-07 19:14:31 +00:00
its-a-feature 2826b39c90 fix a bug where web response for test could be nil 2025-10-07 13:55:12 -05:00
its-a-feature 14e5a10a9a adding translation container semver 2025-10-07 10:57:21 -05:00
its-a-feature 675827ecce updating migration version 2025-10-07 10:53:22 -05:00
Cody Thomas 599cb57682 Merge pull request #487 from its-a-feature/dynamic_params
Dynamic params
2025-10-07 10:28:56 -05:00
its-a-feature 2bd5da93ff updating changelog date 2025-10-07 10:28:02 -05:00
its-a-feature 4896194b0c finalizing dynamic parameters and ui updates for building 2025-10-07 09:58:48 -05:00
its-a-feature fae956bec4 updating for new global setting 2025-09-11 13:45:06 -05:00
its-a-feature 09e0b011f1 adding global setting for webhooks 2025-09-11 12:01:45 -05:00
its-a-feature 62c60601c3 ui updates for payload/wrapper builds 2025-09-11 10:38:48 -05:00
its-a-feature 461c6c689e payload building changes 2025-09-08 16:50:30 -05:00
its-a-feature b7d113753f more updates for new and dynamic build process 2025-09-05 09:06:42 -05:00
its-a-feature 1f274b0697 initial dynamic params update 2025-09-05 09:06:42 -05:00
github-actions c52a6c66e9 Bump Mythic Dockerfile tag to match release 'v3.3.0.136' 2025-09-05 13:36:21 +00:00
its-a-feature 74864c1803 fixing bug in staging_translation 2025-09-05 08:18:22 -05:00
github-actions 364f87a6f2 Bump Mythic Dockerfile tag to match release 'v3.3.0.135' 2025-08-27 19:30:33 +00:00
its-a-feature a1094f6076 fixing database global settings 2025-08-27 14:12:17 -05:00
its-a-feature f898a09c83 updating to call on start for logging/webhook containers 2025-08-27 13:55:53 -05:00
github-actions c416292714 Bump Mythic Dockerfile tag to match release 'v3.3.0.133' 2025-08-24 14:14:31 +00:00
its-a-feature 759ab426b6 fixing bug with eventing 2025-08-24 08:57:21 -05:00
its-a-feature cd3e5ed774 updating new table context menu in browser scripts 2025-08-21 10:47:10 -05:00
github-actions ffafcd86b9 Bump Mythic Dockerfile tag to match release 'v3.3.0.131' 2025-08-21 15:04:24 +00:00
its-a-feature 7e9394e070 updating to not pull from env config 2025-08-21 09:42:30 -05:00
its-a-feature 2a6bd6e50b updated compiled ui 2025-08-21 09:34:31 -05:00
its-a-feature c0f7b94b2f browser script options, invite links, global settings, and more 2025-08-21 09:24:55 -05:00
github-actions 62c1151c47 Bump Mythic Dockerfile tag to match release 'v3.3.0.130' 2025-08-20 19:10:46 +00:00
its-a-feature 8deb1d9913 updating pypi package 2025-08-20 13:52:59 -05:00
github-actions 084ab87593 Bump Mythic Dockerfile tag to match release 'v3.3.0.129' 2025-08-19 16:29:51 +00:00
its-a-feature 977f796cb1 updating mythic scripting pypi version 2025-08-19 11:12:17 -05:00
Cody Thomas 07722b7de5 Merge pull request #468 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/multi-96c788614a
Bump on-headers and compression in /MythicReactUI
2025-08-12 09:22:38 -05:00
Cody Thomas b5cac5d3f1 Merge pull request #470 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/form-data-3.0.4
Bump form-data from 3.0.3 to 3.0.4 in /MythicReactUI
2025-08-12 09:22:20 -05:00
github-actions da84bf5a47 Bump Mythic Dockerfile tag to match release 'v3.3.0.128' 2025-08-11 19:39:42 +00:00
its-a-feature ab7f539ed2 fixing bug in eventing creation through UI 2025-08-11 14:22:11 -05:00
its-a-feature ae2d6e8dbd fixing UI bug for eventing task creation 2025-08-04 09:40:39 -05:00
its-a-feature 1b7fd846a2 fixed bug with preferences getting cached 2025-08-01 11:08:15 -05:00
its-a-feature 1e34aeaacc updating slack link 2025-07-30 19:12:06 -05:00
its-a-feature 8e9ca5b14a updating task search to include display params 2025-07-30 12:53:52 -05:00
github-actions 5338775d02 Bump Mythic Dockerfile tag to match release 'v3.3.0.127' 2025-07-30 17:53:08 +00:00
its-a-feature 81c260d4da fixing eventing cron bug 2025-07-30 12:35:26 -05:00
its-a-feature 62f3c4c9c6 adding option to search callbacks by pid 2025-07-29 11:18:16 -05:00
its-a-feature ee7441c599 fixing UI bug with testing consuming services 2025-07-28 18:15:47 -05:00
github-actions 3363e3d2f2 Bump Mythic Dockerfile tag to match release 'v3.3.0.126' 2025-07-25 21:54:58 +00:00
its-a-feature 765018ab74 fixing a UI bug where background images would re-tile on change 2025-07-25 16:37:03 -05:00
dependabot[bot] d36774e0b8 Bump form-data from 3.0.3 to 3.0.4 in /MythicReactUI
Bumps [form-data](https://github.com/form-data/form-data) from 3.0.3 to 3.0.4.
- [Release notes](https://github.com/form-data/form-data/releases)
- [Changelog](https://github.com/form-data/form-data/blob/v3.0.4/CHANGELOG.md)
- [Commits](https://github.com/form-data/form-data/compare/v3.0.3...v3.0.4)

---
updated-dependencies:
- dependency-name: form-data
  dependency-version: 3.0.4
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2025-07-22 07:14:52 +00:00
github-actions 56bcba9b8d Bump Mythic Dockerfile tag to match release 'v3.3.0.125' 2025-07-21 16:44:57 +00:00
its-a-feature ae8f98cf0d updating some syncing code to reduce number of syncs 2025-07-21 11:27:03 -05:00
github-actions 09871f8ba3 Bump Mythic Dockerfile tag to match release 'v3.3.0.124' 2025-07-18 15:49:26 +00:00
its-a-feature 02db11e522 tweaking file uploads to more consistently force completion state 2025-07-18 10:31:57 -05:00
dependabot[bot] db090b63ce Bump on-headers and compression in /MythicReactUI
---
updated-dependencies:
- dependency-name: on-headers
  dependency-version: 1.1.0
  dependency-type: indirect
- dependency-name: compression
  dependency-version: 1.8.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2025-07-17 21:29:45 +00:00
github-actions 4769c29ea1 Bump Mythic Dockerfile tag to match release 'v3.3.0.123' 2025-07-17 16:02:16 +00:00
its-a-feature a6cb5064c5 fixing UI search bug and updating command augment sync states 2025-07-17 10:44:39 -05:00
its-a-feature a725e36443 Updating tag search page and mythic-cli help output 2025-07-16 17:05:00 -05:00
its-a-feature 0ffbe0f0a5 adding more options for tasking context tabs 2025-07-13 08:21:47 -05:00
its-a-feature dc146b8988 updating action menu button color in tables 2025-07-11 13:39:11 -05:00
its-a-feature 77166f400b adding cursor position to ace text fields 2025-07-11 10:34:40 -05:00
github-actions 7dd02aedb4 Bump Mythic Dockerfile tag to match release 'v3.3.0.122' 2025-07-07 16:07:19 +00:00
its-a-feature 6fbf73ceb7 updating subprocess completion flows to preserve subtask status 2025-07-07 10:49:31 -05:00
github-actions a13b8c88c4 Bump Mythic Dockerfile tag to match release 'v3.3.0.121' 2025-07-03 16:21:32 +00:00
its-a-feature b837684a79 updating UI for credential access and server for de-dupe updates 2025-07-03 11:03:51 -05:00
github-actions de2d6080e9 Bump Mythic Dockerfile tag to match release 'v3.3.0.120' 2025-07-02 18:44:29 +00:00
its-a-feature 775156efdc updating cookies for http only Mythic deployments 2025-07-02 13:27:10 -05:00
github-actions 5d5e40369b Bump Mythic Dockerfile tag to match release 'v3.3.0.119' 2025-07-02 04:25:05 +00:00
its-a-feature ac353c3cca adding fallbacks for invite link generation 2025-07-01 23:07:58 -05:00
github-actions a4d61b5e0e Bump Mythic Dockerfile tag to match release 'v3.3.0.118' 2025-07-01 21:22:13 +00:00
its-a-feature 2b4eb73bd5 fixing build bug 2025-07-01 16:04:48 -05:00
its-a-feature b527bf7e0c updating cookie parsing 2025-07-01 07:54:04 -05:00
its-a-feature 4e8eecfe25 fixing email setting bug 2025-06-30 16:39:57 -05:00
its-a-feature faf32c60f1 fixed bug in updating user emails 2025-06-30 15:18:19 -05:00
github-actions 0fcd35a039 Bump Mythic Dockerfile tag to match release 'v3.3.0.117' 2025-06-29 15:05:53 +00:00
its-a-feature 367f954050 adding new task filter options when searching 2025-06-29 09:41:00 -05:00
github-actions 49101478cb Bump Mythic Dockerfile tag to match release 'v3.3.0.116' 2025-06-27 16:49:12 +00:00
its-a-feature 68630fe297 updating PushC2 logic for multiple connections per callback 2025-06-27 12:31:42 -04:00
its-a-feature dbdd60c6fb Adding new payload comparison functionality 2025-06-25 23:03:45 -04:00
its-a-feature c841189f00 updating console view with pr and single task view 2025-06-24 12:23:29 -05:00
Cody Thomas 714aec37cc Merge pull request #464 from DrorDvash/master
New prompt for console-view
2025-06-24 11:49:04 -05:00
its-a-feature 121695b5f1 updating migration constraints 2025-06-23 12:18:34 -05:00
github-actions fd64fa2ba4 Bump Mythic Dockerfile tag to match release 'v3.3.0.115' 2025-06-23 16:39:04 +00:00
its-a-feature bef32bc01b adding tags to payloads/callbacks 2025-06-23 11:21:09 -05:00
Dror Dvash f75cb4f853 New prompt for console-view
2-line prompt with icons.
2025-06-21 18:42:52 +03:00
github-actions f8e71c493b Bump Mythic Dockerfile tag to match release 'v3.3.0.114' 2025-06-20 17:00:38 +00:00
its-a-feature 471d74de44 updated processing of command locations with changing command names 2025-06-20 11:43:33 -05:00
its-a-feature 8cdcd3168b updating tasking UI to show parameter descriptions inline vs hover 2025-06-20 10:12:02 -05:00
github-actions 677ccdcc14 Bump Mythic Dockerfile tag to match release 'v3.3.0.113' 2025-06-18 19:38:11 +00:00
its-a-feature 23e857b940 new ui color choices, checkin bug fix, new edit & build option 2025-06-18 14:20:43 -05:00
github-actions 612eca9061 Bump Mythic Dockerfile tag to match release 'v3.3.0.112' 2025-06-17 18:16:21 +00:00
its-a-feature c16b4d0db3 UI tweaks for cwd and impersonation_context tracking 2025-06-17 12:58:45 -05:00
github-actions d6f454374a Bump Mythic Dockerfile tag to match release 'v3.3.0.111' 2025-06-15 14:59:28 +00:00
its-a-feature 4649197c17 updating some UI color pieces 2025-06-15 09:42:02 -05:00
its-a-feature c3d2bdc328 adding core files for ui 2025-06-13 13:52:39 -05:00
its-a-feature 8f980dcf51 adjusting the tiling for background images 2025-06-13 13:51:26 -05:00
github-actions a21deb9d41 Bump Mythic Dockerfile tag to match release 'v3.3.0.110' 2025-06-13 00:03:16 +00:00
its-a-feature f6535dd91e bug fixes and new cwd/impersonation_context support 2025-06-12 18:45:59 -05:00
its-a-feature b62ea98c10 more UI safeguards for bad ui config values 2025-06-10 14:51:07 -05:00
github-actions 301efc044e Bump Mythic Dockerfile tag to match release 'v3.3.0.109' 2025-06-09 22:37:41 +00:00
its-a-feature 5d0b3d1a94 better handling of dependencies in command attributes 2025-06-09 17:19:19 -05:00
github-actions 25799523d0 Bump Mythic Dockerfile tag to match release 'v3.3.0.108' 2025-06-06 16:16:15 +00:00
its-a-feature 83ef0f2b3a hasura and ui tweaks 2025-06-06 10:58:33 -05:00
github-actions dba92abbc1 Bump Mythic Dockerfile tag to match release 'v3.3.0.107' 2025-06-04 22:18:26 +00:00
its-a-feature ec51eb4f90 new callback blocking functionality and artifact creation workflows 2025-06-04 16:01:15 -05:00
github-actions fcc8398d55 Bump Mythic Dockerfile tag to match release 'v3.3.0.106' 2025-06-03 23:50:23 +00:00
its-a-feature ba75470a64 update database to match new migration version 2025-06-03 18:31:25 -05:00
its-a-feature caa23d3927 fixing UI bug and adding update for mythicrpc call 2025-06-03 18:27:20 -05:00
its-a-feature 7e4603ddec fix for ui auto column width adjustments 2025-06-02 10:26:18 -05:00
its-a-feature 5004a5a043 fixing spacing issue on space payloads table 2025-05-30 16:40:05 -05:00
github-actions e67b1c7339 Bump Mythic Dockerfile tag to match release 'v3.3.0.105' 2025-05-30 19:44:09 +00:00
its-a-feature 6a4c154d75 updating mythic scripting 2025-05-30 11:16:36 -05:00
github-actions d717a58082 Bump Mythic Dockerfile tag to match release 'v3.3.0.104' 2025-05-30 15:06:01 +00:00
its-a-feature 982d7e1391 bulk deletes, ui tweaks, more preferences 2025-05-30 09:48:10 -05:00
github-actions 8b788ccc8c Bump Mythic Dockerfile tag to match release 'v3.3.0.103' 2025-05-22 21:32:54 +00:00
its-a-feature bb280887c6 updating logic bug in callback_token remove processing 2025-05-22 16:15:16 -05:00
github-actions 7d402c4245 Bump Mythic Dockerfile tag to match release 'v3.3.0.102' 2025-05-22 16:46:34 +00:00
its-a-feature 0ddfa50ce4 updating mythic-cli version 2025-05-22 11:28:54 -05:00
Cody Thomas a694353648 Merge pull request #460 from EvanMcBroom/patch-1
Added nginx info to containers to support mythic scripting during container startup
2025-05-22 11:21:58 -05:00
Evan McBroom fbab9d91f6 Reverted editing the wrong array 2025-05-22 12:21:12 -04:00
Evan McBroom 0c95773d21 Added NGINX_USE_SSL 2025-05-22 12:18:29 -04:00
Evan McBroom 1168f79794 Update serviceMetadata.go 2025-05-22 12:13:48 -04:00
github-actions 6188c0fd1e Bump Mythic Dockerfile tag to match release 'v3.3.0.101' 2025-05-21 20:17:54 +00:00
its-a-feature ba1d98dae6 fixing automatic eventing import logic for auto delete 2025-05-21 14:59:50 -05:00
github-actions 8e5b89f06c Bump Mythic Dockerfile tag to match release 'v3.3.0.100' 2025-05-21 18:51:48 +00:00
its-a-feature 5927919dc4 updating server version location 2025-05-21 13:29:39 -05:00
github-actions 7c7a545e86 Bump Mythic Dockerfile tag to match release 'v3.3.0.99' 2025-05-21 14:56:36 +00:00
its-a-feature d1443be757 fixing some UI issues with updated apollo query library for searching 2025-05-21 09:37:52 -05:00
github-actions ac49ee1d89 Bump Mythic Dockerfile tag to match release 'v3.3.0.98' 2025-05-19 22:09:33 +00:00
its-a-feature 463167427f fixed looping issue with process data pid reuse 2025-05-19 16:51:50 -05:00
github-actions 57085f500b Bump Mythic Dockerfile tag to match release 'v3.3.0.97' 2025-05-16 20:21:36 +00:00
its-a-feature 8365c9e0bf fixing issue with toggling apitoken hidden 2025-05-16 15:04:03 -05:00
github-actions 31115f18fc Bump Mythic Dockerfile tag to match release 'v3.3.0.96' 2025-05-16 20:02:36 +00:00
its-a-feature 83cf83edea fixing settings table getter function 2025-05-16 14:45:00 -05:00
github-actions b800a1dcb0 Bump Mythic Dockerfile tag to match release 'v3.3.0.95' 2025-05-16 19:02:10 +00:00
its-a-feature 846a181bb4 fixing a few UI bugs for bulk actions 2025-05-16 13:43:24 -05:00
github-actions a0517b6a52 Bump Mythic Dockerfile tag to match release 'v3.3.0.94' 2025-05-14 15:02:08 +00:00
its-a-feature c47d16f0d0 fixing bug with updated payload command lists 2025-05-14 09:43:25 -05:00
github-actions 208d580d96 Bump Mythic Dockerfile tag to match release 'v3.3.0.93' 2025-05-11 14:03:13 +00:00
its-a-feature 8ead31a150 UI updates, server fixes 2025-05-11 08:46:17 -05:00
Cody Thomas fef2234bed Merge pull request #458 from piolug93/patch-1
Add missing field in sql statment in MythicRPCAPITokenCreate
2025-05-08 11:32:01 -05:00
piolug93 9299cf9ef9 Add missing field in sql statment in MythicRPCAPITokenCreate 2025-05-08 17:48:20 +02:00
its-a-feature 26decb421f updated virtualized row heights based on text font size 2025-04-16 13:01:34 -05:00
its-a-feature 4044c1346c updating tag search fields to distinct on tagged item id not tag id 2025-04-15 13:59:19 -05:00
github-actions 0c887f4acf Bump Mythic Dockerfile tag to match release 'v3.3.0.92' 2025-04-15 14:43:27 +00:00
its-a-feature 81934665ef reduce duplicate c2 starts and update log for new payloads 2025-04-15 09:15:51 -05:00
github-actions 5c48a51507 Bump Mythic Dockerfile tag to match release 'v3.3.0.91' 2025-04-10 21:51:14 +00:00
its-a-feature b295ebd3ae updating the handling of report generation 2025-04-10 16:33:07 -05:00
its-a-feature ab699c5685 slight UI tweak for text fields 2025-04-10 15:46:18 -05:00
github-actions dd9bef6daf Bump Mythic Dockerfile tag to match release 'v3.3.0.90' 2025-04-09 18:28:39 +00:00
its-a-feature 19bb380f12 updated linked agent checkins and updated mythictree task ids 2025-04-09 13:09:41 -05:00
its-a-feature 5aa4d3453f fixing label 2025-04-07 11:43:34 -05:00
github-actions 59862978de Bump Mythic Dockerfile tag to match release 'v3.3.0.89' 2025-04-07 15:59:09 +00:00
its-a-feature 48e1ddb9a5 update socks to bind to ipv4 addresses 2025-04-07 10:41:37 -05:00
its-a-feature 9d92b1644b slight UI fix 2025-04-07 10:15:33 -05:00
github-actions 04992aa1bc Bump Mythic Dockerfile tag to match release 'v3.3.0.88' 2025-04-04 13:24:08 +00:00
its-a-feature 98eced6f79 fixing sql typo 2025-04-04 08:06:23 -05:00
github-actions ef6fb08cba Bump Mythic Dockerfile tag to match release 'v3.3.0.87' 2025-04-04 02:26:57 +00:00
its-a-feature bc9f3287b7 fixing tag type get or create rpc call 2025-04-03 21:09:38 -05:00
github-actions 16fdecee28 Bump Mythic Dockerfile tag to match release 'v3.3.0.86' 2025-04-02 19:29:42 +00:00
its-a-feature 4fad02e3c9 fix for tag creation 2025-04-02 14:12:06 -05:00
github-actions d3d6d4a2fb Bump Mythic Dockerfile tag to match release 'v3.3.0.85' 2025-04-01 19:07:07 +00:00
its-a-feature ce586d6980 few UI tweaks 2025-04-01 13:48:45 -05:00
github-actions 69feb548e1 Bump Mythic Dockerfile tag to match release 'v3.3.0.84' 2025-03-28 18:55:18 +00:00
its-a-feature 9290ca16af UI tweaks, new eventing trigger, interactive updates, new RPC calls 2025-03-28 13:22:36 -05:00
github-actions 30e5c69dc4 Bump Mythic Dockerfile tag to match release 'v3.3.0.83' 2025-03-19 19:51:04 +00:00
its-a-feature ef7f39f19d fixing UI updating of deleted files 2025-03-19 14:04:39 -05:00
github-actions 6361d93672 Bump Mythic Dockerfile tag to match release 'v3.3.0.82' 2025-03-14 15:00:48 +00:00
its-a-feature 855f633e74 Updating response intercept to not trigger on empty responses 2025-03-14 09:42:51 -05:00
github-actions 26afca9280 Bump Mythic Dockerfile tag to match release 'v3.3.0.81' 2025-03-13 21:03:28 +00:00
its-a-feature a1d225612e updating readme 2025-03-13 15:35:37 -05:00
its-a-feature 80ecc5cfe2 fixing bad struct tag in eventing conditional checks for pypi 2025-03-13 15:26:28 -05:00
its-a-feature b3dcc7d1fc fixing UI vertical icons on short screens 2025-03-12 13:30:20 -05:00
Cody Thomas 166869f6c5 Merge pull request #439 from pidone/fix_install_scripts
Fix Docker installation scripts
2025-03-12 12:36:23 -05:00
github-actions 520995fab9 Bump Mythic Dockerfile tag to match release 'v3.3.0.79' 2025-03-12 16:22:46 +00:00
its-a-feature 5878378db7 updating rabbitmq retry loops 2025-03-12 11:04:10 -05:00
github-actions a819b51404 Bump Mythic Dockerfile tag to match release 'v3.3.0.78' 2025-03-11 22:23:16 +00:00
its-a-feature a906c1afcf allowing custom status during create_tasking 2025-03-11 16:56:27 -05:00
github-actions b72ec32a92 Bump Mythic Dockerfile tag to match release 'v3.3.0.77' 2025-03-07 18:49:48 +00:00
its-a-feature e68be3891a UI tweaks and timeskew updates, server fixes for automation and search 2025-03-07 12:26:59 -06:00
github-actions 340ecb1625 Bump Mythic Dockerfile tag to match release 'v3.3.0.76' 2025-03-05 21:47:25 +00:00
its-a-feature 37fcbd0728 updating file size to bigint to track larger files properly 2025-03-05 15:30:04 -06:00
github-actions ef4637e5ed Bump Mythic Dockerfile tag to match release 'v3.3.0.75' 2025-03-05 20:15:04 +00:00
its-a-feature bbfcb19366 updating rabbitmq looping to add more retries 2025-03-05 13:56:57 -06:00
github-actions 86c6488a89 Bump Mythic Dockerfile tag to match release 'v3.3.0.74' 2025-03-04 23:56:27 +00:00
its-a-feature 1366ebed6c mythic-cli agent install updates and slight ui tweak 2025-03-04 17:24:59 -06:00
github-actions 68c2005ff3 Bump Mythic Dockerfile tag to match release 'v3.3.0.73' 2025-02-28 20:31:53 +00:00
its-a-feature 5f9c16099e adding stdout/stderr from tasks and ui fixes 2025-02-28 13:53:13 -06:00
its-a-feature 71ca8d9122 reduced debouncing on some fields and notification fix 2025-02-21 14:30:32 -06:00
github-actions 2fb43a3314 Bump Mythic Dockerfile tag to match release 'v3.3.0.72' 2025-02-21 16:58:28 +00:00
its-a-feature 0831e8c4e5 added UI config setting for timestamps and rabbitmq server updates 2025-02-21 10:33:33 -06:00
github-actions 9d2e4524eb Bump Mythic Dockerfile tag to match release 'v3.3.0.71' 2025-02-20 20:41:41 +00:00
its-a-feature 1390b4ead6 ui tweak and rabbitmq update for retries 2025-02-20 14:03:11 -06:00
github-actions 734eaba613 Bump Mythic Dockerfile tag to match release 'v3.3.0.70' 2025-02-19 01:43:52 +00:00
its-a-feature 26c64c9763 bug fix for file create mythic rpc with payload uuid 2025-02-18 19:26:35 -06:00
its-a-feature 86fb7ebcaa removing trailing comma 2025-02-18 19:12:39 -06:00
github-actions b2eebeea4e Bump Mythic Dockerfile tag to match release 'v3.3.0.69' 2025-02-18 16:31:06 +00:00
its-a-feature 794b947c1e updating mythic-cli for mythic_sync 2025-02-18 10:13:11 -06:00
github-actions ec58b1293d Bump Mythic Dockerfile tag to match release 'v3.3.0.68' 2025-02-14 17:15:47 +00:00
its-a-feature 695948aac9 bug fix when downloading 0byte file 2025-02-14 10:58:11 -06:00
its-a-feature 9741c7a66b slight ui tweak for handling newlines in array entries in modals 2025-02-13 15:59:41 -06:00
github-actions f363544542 Bump Mythic Dockerfile tag to match release 'v3.3.0.67' 2025-02-13 18:12:38 +00:00
its-a-feature 2f0c7d7c54 mythic-cli fix for mythic_sync installs 2025-02-13 11:54:48 -06:00
its-a-feature dddca779c6 updating sponsors 2025-02-13 08:53:58 -06:00
github-actions 6fd06f8f5c Bump Mythic Dockerfile tag to match release 'v3.3.0.66' 2025-02-10 15:44:08 +00:00
its-a-feature a694d3dd20 rabbitmq reverts 2025-02-10 09:28:17 -06:00
github-actions 1f27126215 Bump Mythic Dockerfile tag to match release 'v3.3.0.65' 2025-02-10 15:24:46 +00:00
its-a-feature 343cefcfec rabbitmq queue tweaks 2025-02-10 09:08:39 -06:00
github-actions fa245e66e9 Bump Mythic Dockerfile tag to match release 'v3.3.0.64' 2025-02-07 23:36:20 +00:00
its-a-feature 1559d5b924 few UI fixes and backend tweaks 2025-02-07 17:21:03 -06:00
its-a-feature 7be2931d09 ui fix for interactive tasking 2025-02-05 17:52:41 -06:00
its-a-feature 83aa363aa0 fixing bug with interactive tasking UI 2025-02-04 12:49:24 -06:00
its-a-feature f5f34448be improving performance on text fields with debouncing 2025-01-31 14:25:30 -06:00
its-a-feature 14986933d6 few UI tweaks 2025-01-30 15:53:12 -06:00
github-actions 8e35c4d922 Bump Mythic Dockerfile tag to match release 'v3.3.0.63' 2025-01-30 18:33:50 +00:00
its-a-feature d6608d687c bug fix for command augment containers 2025-01-30 12:18:41 -06:00
github-actions 436641bb07 Bump Mythic Dockerfile tag to match release 'v3.3.0.62' 2025-01-30 15:53:19 +00:00
its-a-feature 554128d8e3 few bug fixes in server and UI 2025-01-30 09:37:02 -06:00
Pidone 3c934d9758 Fix Docker installation scripts
apt-key is deprecated and already removed on kali.
2025-01-29 16:52:14 +01:00
its-a-feature 1e17d90c5d making a few components have transparent backgrounds 2025-01-24 16:01:17 -06:00
github-actions fe3e788b89 Bump Mythic Dockerfile tag to match release 'v3.3.0.61' 2025-01-24 20:42:09 +00:00
its-a-feature 2772b6c520 mythicRPC fixes and a few UI tweaks 2025-01-24 14:26:23 -06:00
its-a-feature 90ec9e2496 updating dependencies 2025-01-18 12:05:33 -06:00
its-a-feature 78eb2edba3 slight UI tweak for tag search page 2025-01-18 11:57:49 -06:00
github-actions a88a1f79d4 Bump Mythic Dockerfile tag to match release 'v3.3.0.60' 2025-01-18 17:51:45 +00:00
its-a-feature 1255a2560e many GUI enhancements and a few API additions for eventing 2025-01-18 11:36:21 -06:00
its-a-feature 156bca4692 adjusting dashboard page 2024-12-31 17:24:06 -06:00
its-a-feature e22274760c few more ui tweaks 2024-12-31 15:54:15 -06:00
github-actions 6ded9fa3f7 Bump Mythic Dockerfile tag to match release 'v3.3.0.59' 2024-12-31 19:31:00 +00:00
its-a-feature 191191e538 ui tweaks, header size changes, icon fixing 2024-12-31 13:15:49 -06:00
github-actions 8d63fadb2a Bump Mythic Dockerfile tag to match release 'v3.3.0.58' 2024-12-31 17:58:46 +00:00
its-a-feature 2a43f18c20 updating new vertical nav bar 2024-12-31 11:43:24 -06:00
github-actions 20779914d4 Bump Mythic Dockerfile tag to match release 'v3.3.0.57' 2024-12-28 16:18:53 +00:00
its-a-feature fa4b57dfd8 adding new UI option for vertical/customizable nav bar 2024-12-28 09:46:26 -06:00
github-actions 90128d0b28 Bump Mythic Dockerfile tag to match release 'v3.3.0.56' 2024-12-25 15:38:20 +00:00
its-a-feature 81a19552d7 few UI fixes 2024-12-25 09:22:47 -06:00
github-actions 801a2dad26 Bump Mythic Dockerfile tag to match release 'v3.3.0.55' 2024-12-23 17:56:26 +00:00
its-a-feature 5efdde0944 server skew, callback colors, bug fixes, and prep for future updates 2024-12-23 11:41:06 -06:00
its-a-feature 2a8b5d2711 fix for task status with interactive tasking 2024-12-18 19:39:10 -06:00
github-actions e43295e2dd Bump Mythic Dockerfile tag to match release 'v3.3.0.54' 2024-12-18 21:50:35 +00:00
its-a-feature 0e942f09bc fix issue with missing containers 2024-12-18 15:35:04 -06:00
github-actions 062504298b Bump Mythic Dockerfile tag to match release 'v3.3.0.53' 2024-12-18 18:56:01 +00:00
its-a-feature d30efca930 updating mythic cli to speed things up a bit 2024-12-18 11:34:09 -06:00
github-actions 82b67d65e0 Bump Mythic Dockerfile tag to match release 'v3.3.0.52' 2024-12-18 14:39:01 +00:00
its-a-feature 85efc505d5 login fix 2024-12-18 08:23:03 -06:00
github-actions af15bcb113 Bump Mythic Dockerfile tag to match release 'v3.3.0.51' 2024-12-17 21:24:11 +00:00
its-a-feature f4306629db Merge remote-tracking branch 'origin/master' 2024-12-17 15:08:24 -06:00
its-a-feature 173cd294e9 slight UI update for task response streaming and time syncing 2024-12-17 15:08:15 -06:00
github-actions 076d8f762f Bump Mythic Dockerfile tag to match release 'v3.3.0.50' 2024-12-15 14:09:21 +00:00
its-a-feature eddbd55141 updating MythicRPC commands for Callback Search/Add/Remove 2024-12-14 10:19:22 -06:00
github-actions 2991f5339e Bump Mythic Dockerfile tag to match release 'v3.3.0.49' 2024-12-13 16:08:27 +00:00
its-a-feature e5b7dbfe8e updating payload syncing flags 2024-12-13 09:52:57 -06:00
github-actions 1630f03209 Bump Mythic Dockerfile tag to match release 'v3.3.0.48' 2024-12-13 00:25:56 +00:00
its-a-feature 9cdd6c669c UI and Server fixes for dynamic command augmentation 2024-12-12 18:09:48 -06:00
github-actions 3c87e7be9e Bump Mythic Dockerfile tag to match release 'v3.3.0.47' 2024-12-12 20:59:13 +00:00
its-a-feature 4b704f5d99 UI fixes 2024-12-12 14:43:57 -06:00
github-actions 31a0f3b642 Bump Mythic Dockerfile tag to match release 'v3.3.0.46' 2024-12-10 21:47:56 +00:00
Cody Thomas 554a135370 Merge pull request #433 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/nanoid-3.3.8
Bump nanoid from 3.3.7 to 3.3.8 in /MythicReactUI
2024-12-10 13:53:21 -06:00
dependabot[bot] 9f79f4d7fe Bump nanoid from 3.3.7 to 3.3.8 in /MythicReactUI
Bumps [nanoid](https://github.com/ai/nanoid) from 3.3.7 to 3.3.8.
- [Release notes](https://github.com/ai/nanoid/releases)
- [Changelog](https://github.com/ai/nanoid/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ai/nanoid/compare/3.3.7...3.3.8)

---
updated-dependencies:
- dependency-name: nanoid
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2024-12-10 19:07:54 +00:00
its-a-feature 64a08d92ff adding optimizations for messages with many responses
also added a few UI fixes
2024-12-10 13:06:43 -06:00
github-actions 42b62058a3 Bump Mythic Dockerfile tag to match release 'v3.3.0.45' 2024-12-04 18:15:40 +00:00
its-a-feature 2d35ea1eec UI update to fix callback tokens rendering issue 2024-12-04 07:58:05 -10:00
github-actions 331b95805d Bump Mythic Dockerfile tag to match release 'v3.3.0.44' 2024-11-27 22:22:18 +00:00
its-a-feature b4aa736586 updating the _use_volume setting to false for new agent installs 2024-11-27 16:07:07 -06:00
github-actions ec2078d339 Bump Mythic Dockerfile tag to match release 'v3.3.0.43' 2024-11-27 20:59:29 +00:00
its-a-feature 16b6d33526 updated to not raise errors unnecessarily for c2 status updates 2024-11-27 14:43:57 -06:00
its-a-feature 96b05c9333 few UI tweaks on the payloads page for better output viewing 2024-11-27 14:23:28 -06:00
github-actions 83f81c9dca Bump Mythic Dockerfile tag to match release 'v3.3.0.42' 2024-11-26 20:31:47 +00:00
its-a-feature ab5c5a9768 updating actions for invite links 2024-11-26 14:16:50 -06:00
its-a-feature 56ef65276c updating command augment injection args 2024-11-26 14:09:44 -06:00
github-actions 467d948ac1 Bump Mythic Dockerfile tag to match release 'v3.3.0.41' 2024-11-26 19:48:02 +00:00
its-a-feature 82b335cded updates to invite links 2024-11-26 13:18:34 -06:00
github-actions f9417645d2 Bump Mythic Dockerfile tag to match release 'v3.3.0.40' 2024-11-22 16:45:17 +00:00
its-a-feature c8d6e9fa9e adding new features and some slight ui fixes 2024-11-22 10:23:14 -06:00
github-actions 8f7625c883 Bump Mythic Dockerfile tag to match release 'v3.3.0.39' 2024-11-18 21:06:45 +00:00
its-a-feature 2752e5fece updating file hosting processes 2024-11-18 14:51:53 -06:00
github-actions 8a96739120 Bump Mythic Dockerfile tag to match release 'v3.3.0.38' 2024-11-18 18:20:18 +00:00
its-a-feature 99f1e7a7a3 onStart container apitoken fix and slight UI tweak 2024-11-18 12:04:28 -06:00
its-a-feature 688b2ca946 re-adding non-git lfs files 2024-11-15 15:09:37 -06:00
its-a-feature 71ba45c2f9 removing .gitattributes on this branch 2024-11-15 15:06:03 -06:00
its-a-feature b2443d1ca2 updating react files to use git lfs 2024-11-15 14:25:07 -06:00
its-a-feature ade07381c1 updating gitattributes 2024-11-15 14:21:49 -06:00
its-a-feature 228c0ab57b updating git attributes for lfs on compiled react ui pages 2024-11-15 14:17:25 -06:00
github-actions 43a081c82d Bump Mythic Dockerfile tag to match release 'v3.3.0.37' 2024-11-15 03:09:54 +00:00
its-a-feature c51b900777 small ui tweak 2024-11-14 20:52:43 -06:00
github-actions 0cfb6b0ca7 Bump Mythic Dockerfile tag to match release 'v3.3.0.36' 2024-11-15 02:39:50 +00:00
its-a-feature 51cf1c9ff5 Save user preferences to database 2024-11-14 20:24:22 -06:00
github-actions 05ed8b14f1 Bump Mythic Dockerfile tag to match release 'v3.3.0.35' 2024-11-08 21:32:52 +00:00
its-a-feature 55c95cba5b slight ui fix 2024-11-08 15:17:17 -06:00
github-actions 5fae8eeb7d Bump Mythic Dockerfile tag to match release 'v3.3.0.34' 2024-11-06 21:16:37 +00:00
its-a-feature 8da0ed6ace one more tweak to the payload search 2024-11-06 15:01:29 -06:00
its-a-feature ab63e3862e updating to fix payload search bug 2024-11-06 14:56:48 -06:00
github-actions 6683e9853f Bump Mythic Dockerfile tag to match release 'v3.3.0.32' 2024-11-06 13:58:11 +00:00
its-a-feature fe59952384 few UI CLI tweaks 2024-11-06 07:42:43 -06:00
github-actions 96fe2e8a49 Bump Mythic Dockerfile tag to match release 'v3.3.0.31' 2024-11-05 21:08:33 +00:00
its-a-feature badb562ebe adding additional checks for operator status 2024-11-05 14:52:52 -06:00
its-a-feature 4d95dc8d36 fixing opsec check bypass request 2024-11-05 14:48:07 -06:00
github-actions 6b2de0c719 Bump Mythic Dockerfile tag to match release 'v3.3.0.29' 2024-11-05 17:36:48 +00:00
its-a-feature e1c37ba5ca UI updates and temp tweak for wrappers 2024-11-05 11:21:42 -06:00
github-actions ef79c90d75 Bump Mythic Dockerfile tag to match release 'v3.3.0.28' 2024-11-01 12:50:18 +00:00
its-a-feature 319a71598a fixing regression with screenshots added to file browser 2024-11-01 08:34:51 -04:00
github-actions ce5057e58d Bump Mythic Dockerfile tag to match release 'v3.3.0.27' 2024-10-28 18:47:21 +00:00
its-a-feature e8737b4223 updating missing hasura permissions 2024-10-28 13:32:15 -05:00
github-actions 767f82aa3d Bump Mythic Dockerfile tag to match release 'v3.3.0.26' 2024-10-28 17:16:00 +00:00
its-a-feature 5f85d9e716 fixing bug with processes not getting marked as deleted 2024-10-28 12:00:57 -05:00
github-actions 74536d4948 Bump Mythic Dockerfile tag to match release 'v3.3.0.25' 2024-10-28 14:44:20 +00:00
its-a-feature 5979d236bc ui fixes and proxy stop fix via MythicRPC
added support for setting cli history to be display params vs original params per agent
2024-10-28 09:13:56 -05:00
github-actions 641c8e1d60 Bump Mythic Dockerfile tag to match release 'v3.3.0.24' 2024-10-18 13:45:36 +00:00
its-a-feature 208611543c Updating to better reflected deleted payloads not making callbacks 2024-10-18 08:30:46 -05:00
github-actions dfad0dea3d Bump Mythic Dockerfile tag to match release 'v3.3.0.23' 2024-10-16 17:02:26 +00:00
its-a-feature f7cd34d9da UI update to save callbacks table column widths 2024-10-16 11:36:38 -05:00
github-actions db37b43465 Bump Mythic Dockerfile tag to match release 'v3.3.0.22' 2024-10-14 17:16:26 +00:00
its-a-feature 617d927472 Many UI Fixes and features added
added UDP Associate and more UI Tab-complete options
2024-10-14 11:25:33 -05:00
Cody Thomas 63a6d5e106 Merge pull request #411 from art-dsit/art/rootless_2
Prevent root-owned files ending up on the filesystem during CLI build
2024-10-08 08:20:48 -05:00
github-actions e58eead1fd Bump Mythic Dockerfile tag to match release 'v3.3.0.21' 2024-10-01 23:07:08 +00:00
Cody Thomas 52d33aef7a Merge pull request #409 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/multi-d66d039ac5
Bump serve-static and express in /MythicReactUI
2024-10-01 17:48:56 -05:00
Cody Thomas 2aa45ebb3a Merge pull request #385 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/ejs-3.1.10
Bump ejs from 3.1.9 to 3.1.10 in /MythicReactUI
2024-10-01 17:48:44 -05:00
Cody Thomas eb730689b0 Merge pull request #404 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/webpack-5.94.0
Bump webpack from 5.92.0 to 5.94.0 in /MythicReactUI
2024-10-01 17:48:34 -05:00
Cody Thomas 7369449c49 Merge pull request #410 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/multi-cf87d80143
Bump send and express in /MythicReactUI
2024-10-01 17:48:25 -05:00
Cody Thomas 22550d9022 Merge pull request #412 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/multi-9423f4c335
Bump body-parser and express in /MythicReactUI
2024-10-01 17:48:11 -05:00
Cody Thomas 150209dc8f Merge pull request #413 from its-a-feature/dependabot/npm_and_yarn/MythicReactUI/rollup-2.79.2
Bump rollup from 2.79.1 to 2.79.2 in /MythicReactUI
2024-10-01 17:47:29 -05:00
its-a-feature 4702b6a00c removing fade transitions to make a snappier UI 2024-10-01 17:47:00 -05:00
github-actions 122fe892af Bump Mythic Dockerfile tag to match release 'v3.3.0.20' 2024-09-29 16:14:40 +00:00
its-a-feature faaab0d3a1 Allow tab-cycle ChooseOne values on the command line in the UI 2024-09-29 10:59:37 -05:00
github-actions eaccded888 Bump Mythic Dockerfile tag to match release 'v3.3.0.19' 2024-09-27 20:22:29 +00:00
its-a-feature 273f9a5c71 UI QoL and proxy stop fixes 2024-09-27 15:07:30 -05:00
dependabot[bot] 3b58f30f3d Bump rollup from 2.79.1 to 2.79.2 in /MythicReactUI
Bumps [rollup](https://github.com/rollup/rollup) from 2.79.1 to 2.79.2.
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v2.79.1...v2.79.2)

---
updated-dependencies:
- dependency-name: rollup
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2024-09-27 17:14:20 +00:00
github-actions a4533926a3 Bump Mythic Dockerfile tag to match release 'v3.3.0.18' 2024-09-26 01:41:34 +00:00
its-a-feature c4284e5f10 added some max size checks for postgres inserts 2024-09-25 20:26:29 -05:00
github-actions c2d386f8ec Bump Mythic Dockerfile tag to match release 'v3.3.0.17' 2024-09-24 16:33:20 +00:00
its-a-feature 2c52598d1c Adding a bit more verbose output for agent error messages 2024-09-24 11:18:13 -05:00
github-actions 13abd19cf5 Bump Mythic Dockerfile tag to match release 'v3.3.0.16' 2024-09-23 22:37:50 +00:00
its-a-feature dc3caff0b5 updating missing struct tag 2024-09-23 17:22:20 -05:00
github-actions efa88a329d Bump Mythic Dockerfile tag to match release 'v3.3.0.15' 2024-09-23 17:00:29 +00:00
its-a-feature 605cbf8fc3 fixing UI visual bug and starting to address potential database deadlock 2024-09-23 11:44:52 -05:00
dependabot[bot] 5bc4c0a993 Bump body-parser and express in /MythicReactUI
Bumps [body-parser](https://github.com/expressjs/body-parser) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `body-parser` from 1.20.2 to 1.20.3
- [Release notes](https://github.com/expressjs/body-parser/releases)
- [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/body-parser/compare/1.20.2...1.20.3)

Updates `express` from 4.19.2 to 4.21.0
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.0/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.19.2...4.21.0)

---
updated-dependencies:
- dependency-name: body-parser
  dependency-type: indirect
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2024-09-22 01:51:00 +00:00
Art.Cathain 033ce4f6f6 fix 2024-09-18 13:58:44 +00:00
Art.Cathain bbf0324cb1 toor 2024-09-18 13:54:48 +00:00
github-actions e0618a487b Bump Mythic Dockerfile tag to match release 'v3.3.0.14' 2024-09-17 20:00:10 +00:00
its-a-feature 0b539dfafb fixing initializer 2024-09-17 14:44:20 -05:00
github-actions e83bd2e67a Bump Mythic Dockerfile tag to match release 'v3.3.0.13' 2024-09-17 17:39:48 +00:00
its-a-feature f09c3695f4 adjusting database initialization to auto create bot account 2024-09-17 12:24:32 -05:00
dependabot[bot] 3cd5ff5bd7 Bump send and express in /MythicReactUI
Bumps [send](https://github.com/pillarjs/send) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `send` from 0.18.0 to 0.19.0
- [Release notes](https://github.com/pillarjs/send/releases)
- [Changelog](https://github.com/pillarjs/send/blob/master/HISTORY.md)
- [Commits](https://github.com/pillarjs/send/compare/0.18.0...0.19.0)

Updates `express` from 4.19.2 to 4.21.0
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.0/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.19.2...4.21.0)

---
updated-dependencies:
- dependency-name: send
  dependency-type: indirect
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2024-09-17 10:49:38 +00:00
dependabot[bot] 07fac1c321 Bump serve-static and express in /MythicReactUI
Bumps [serve-static](https://github.com/expressjs/serve-static) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `serve-static` from 1.15.0 to 1.16.2
- [Release notes](https://github.com/expressjs/serve-static/releases)
- [Changelog](https://github.com/expressjs/serve-static/blob/v1.16.2/HISTORY.md)
- [Commits](https://github.com/expressjs/serve-static/compare/v1.15.0...v1.16.2)

Updates `express` from 4.19.2 to 4.21.0
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/4.21.0/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.19.2...4.21.0)

---
updated-dependencies:
- dependency-name: serve-static
  dependency-type: indirect
- dependency-name: express
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2024-09-17 10:23:56 +00:00
github-actions 39fde7b75a Bump Mythic Dockerfile tag to match release 'v3.3.0.12' 2024-09-14 14:47:39 +00:00
its-a-feature 9032a6f70b updating tasking tabs to be more consistent with task handling 2024-09-14 09:32:53 -05:00
github-actions fcb1dd53b1 Bump Mythic Dockerfile tag to match release 'v3.3.0.11' 2024-09-13 21:22:59 +00:00
its-a-feature 9852d5d06c UI bug fix and increased web logging 2024-09-13 16:07:33 -05:00
github-actions 11bfff6736 Bump Mythic Dockerfile tag to match release 'v3.3.0.10' 2024-09-10 20:20:14 +00:00
its-a-feature 1f9581bc65 fixing c2 profile config page skipping keystrokes 2024-09-10 15:04:58 -05:00
github-actions 3c8243ed21 Bump Mythic Dockerfile tag to match release 'v3.3.0.9' 2024-09-09 20:27:43 +00:00
its-a-feature d223507785 few UI tweaks and better error messages 2024-09-09 15:11:56 -05:00
github-actions ed03ae279b Bump Mythic Dockerfile tag to match release 'v3.3.0.8' 2024-09-04 19:37:02 +00:00
dependabot[bot] 59b9003552 Bump webpack from 5.92.0 to 5.94.0 in /MythicReactUI
Bumps [webpack](https://github.com/webpack/webpack) from 5.92.0 to 5.94.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.92.0...v5.94.0)

---
updated-dependencies:
- dependency-name: webpack
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>
2024-09-04 19:23:05 +00:00
its-a-feature c8a1437880 mythic-cli updates, MythicRPC updates, and mythic ui tweaks 2024-09-04 14:21:52 -05:00
github-actions 937fcbdb17 Bump Mythic Dockerfile tag to match release 'v3.3.0.7' 2024-09-03 03:29:05 +00:00
its-a-feature bde3dbfa66 Merge branch 'master' of https://github.com/its-a-feature/Mythic 2024-09-02 22:14:13 -05:00
its-a-feature 3146b8a76b adding first chunk with file download capabilities 2024-09-02 22:14:01 -05:00
github-actions bec5422883 Bump Mythic Dockerfile tag to match release 'v3.3.0.6' 2024-09-02 17:17:47 +00:00
its-a-feature 85f617a0ef fixing file search bug 2024-09-02 12:02:45 -05:00
github-actions c55e41a816 Bump Mythic Dockerfile tag to match release 'v3.3.0.5' 2024-08-30 22:19:34 +00:00
its-a-feature 3c66f77454 file search bug fix, eventing examples, and ui bug fixes 2024-08-30 17:04:37 -05:00
Cody Thomas f82f8fb738 Merge pull request #396 from launchdaemon/master
Make install_docker scripts architecture independent
2024-08-30 09:08:39 -05:00
github-actions 3fb69aa921 Bump Mythic Dockerfile tag to match release 'v3.3.0.4' 2024-08-30 14:08:15 +00:00
its-a-feature 9da13680e5 Merge branch 'master' of https://github.com/its-a-feature/Mythic 2024-08-30 08:53:48 -05:00
its-a-feature 6daf1cf211 Fixing bug with last checkin times when restarting 2024-08-30 08:53:38 -05:00
github-actions f4494f379a Bump Mythic Dockerfile tag to match release 'v3.3.0.3' 2024-08-29 18:42:42 +00:00
its-a-feature fef7336509 file browser and media display tweaks 2024-08-29 13:27:37 -05:00
github-actions 5c17b50ba5 Bump Mythic Dockerfile tag to match release 'v3.3.0.2' 2024-08-28 23:05:00 +00:00
its-a-feature e8f48ce5ff Merge branch 'master' of https://github.com/its-a-feature/Mythic 2024-08-28 17:50:07 -05:00
its-a-feature 5fdf8f11fc file browser bug fix and ui tweak 2024-08-28 17:49:46 -05:00
github-actions cde711ab3e Bump Mythic Dockerfile tag to match release 'v3.3.0.1' 2024-08-28 21:59:20 +00:00
its-a-feature 981414297c Merge branch 'master' of https://github.com/its-a-feature/Mythic 2024-08-28 16:43:41 -05:00
its-a-feature a6b5cd1db0 fixing UI bug on fresh installs with file browser 2024-08-28 16:43:09 -05:00
github-actions 477f7cf125 Bump Mythic Dockerfile tag to match release 'v3.3.0.0' 2024-08-28 18:57:00 +00:00
Cody Thomas 9b9469622f Merge pull request #400 from its-a-feature/Mythic3.3
rolling back docker api change
2024-08-28 13:22:56 -05:00
its-a-feature 346d0dd6d4 rolling back docker api change 2024-08-28 13:22:29 -05:00
Cody Thomas 9ff3015e15 Merge pull request #399 from its-a-feature/Mythic3.3
Mythic3.3
2024-08-28 13:14:24 -05:00
Cody Thomas 3ac8a64cdd Merge branch 'master' into Mythic3.3 2024-08-28 13:10:57 -05:00
its-a-feature 9be2fa335a Merge branch 'Mythic3.3' of https://github.com/its-a-feature/Mythic into Mythic3.3 2024-08-28 13:08:37 -05:00
its-a-feature 89d336e455 Final update for base Mythic3.3 2024-08-28 13:08:22 -05:00
github-actions 9b4b9d8b6b Bump Mythic Dockerfile tag to match release 'v3.2.20' 2024-08-28 15:12:27 +00:00
github-actions e0ae20697b Bump Mythic Dockerfile tag to match release 'v0.0.4.41' 2024-08-27 23:32:07 +00:00
its-a-feature 7b87af9d4d fixing an extra set of quotes 2024-08-27 18:17:28 -05:00
github-actions 5bb16bb39f Bump Mythic Dockerfile tag to match release 'v0.0.4.40' 2024-08-27 23:03:39 +00:00
its-a-feature e64deac9bb Merge branch 'Mythic3.3' of https://github.com/its-a-feature/Mythic into Mythic3.3 2024-08-27 17:48:47 -05:00
its-a-feature bbac3fc253 removing duplicates from extra_hosts 2024-08-27 17:48:35 -05:00
github-actions 48105e7b45 Bump Mythic Dockerfile tag to match release 'v0.0.4.39' 2024-08-27 22:42:44 +00:00
its-a-feature 65e32fc687 adding "host" option for mythic networking and test workflow files 2024-08-27 17:28:15 -05:00
github-actions f82a81dc9a Bump Mythic Dockerfile tag to match release 'v0.0.4.38' 2024-08-27 00:17:58 +00:00
its-a-feature ac76b0088a fixing UI colors in light mode 2024-08-26 19:03:08 -05:00
github-actions f03e694a92 Bump Mythic Dockerfile tag to match release 'v0.0.4.37' 2024-08-24 19:41:42 +00:00
its-a-feature 1e0f1d6865 Merge branch 'Mythic3.3' of https://github.com/its-a-feature/Mythic into Mythic3.3 2024-08-24 14:27:28 -05:00
its-a-feature 3da1dda00f quick fix for delegate messages 2024-08-24 14:26:59 -05:00
github-actions 3a792024eb Bump Mythic Dockerfile tag to match release 'v0.0.4.36' 2024-08-23 21:48:09 +00:00
its-a-feature 596c6f799b Updated processing for delegates and file downloads, more ui improvement 2024-08-23 16:34:03 -05:00
github-actions d3d5e5c913 Bump Mythic Dockerfile tag to match release 'v0.0.4.35' 2024-08-23 13:52:28 +00:00
its-a-feature 86ec7b2757 removing unnecessary linked agent messages 2024-08-23 08:38:31 -05:00
github-actions 7586b27de3 Bump Mythic Dockerfile tag to match release 'v0.0.4.34' 2024-08-21 20:15:32 +00:00
its-a-feature 4bc0e5974e adding new ability to limit credential dropdowns in the ui 2024-08-21 14:59:27 -05:00
github-actions 3be20a22ee Bump Mythic Dockerfile tag to match release 'v0.0.4.33' 2024-08-20 21:17:23 +00:00
its-a-feature 653e5cb3ec adding option for inserting new lines when issuing tasking 2024-08-20 16:03:24 -05:00
github-actions 5756718433 Bump Mythic Dockerfile tag to match release 'v0.0.4.32' 2024-08-20 16:39:39 +00:00
its-a-feature 2df48e0d23 fixing an issue with task tags not showing text 2024-08-20 11:24:24 -05:00
github-actions 1a321aaad8 Bump Mythic Dockerfile tag to match release 'v0.0.4.31' 2024-08-20 02:28:04 +00:00
its-a-feature 1072fcfe9a more UI updates 2024-08-19 21:13:50 -05:00
github-actions 5ad5baa800 Bump Mythic Dockerfile tag to match release 'v0.0.4.30' 2024-08-19 15:57:20 +00:00
its-a-feature e6ada84bef fixing UI parsing issue 2024-08-19 10:43:21 -05:00
github-actions d59df9ab1f Bump Mythic Dockerfile tag to match release 'v0.0.4.29' 2024-08-17 14:03:47 +00:00
its-a-feature 25d3150f6f ini highlight support 2024-08-17 08:49:43 -05:00
github-actions d1f1730d77 Bump Mythic Dockerfile tag to match release 'v0.0.4.28' 2024-08-14 19:54:16 +00:00
its-a-feature eea163dcfe fixing console view for tasks 2024-08-14 14:40:11 -05:00
github-actions 1396906d96 Bump Mythic Dockerfile tag to match release 'v0.0.4.27' 2024-08-14 15:49:04 +00:00
its-a-feature 3443536d7c small UI tweaks 2024-08-14 10:34:44 -05:00
github-actions 11ded6c52c Bump Mythic Dockerfile tag to match release 'v0.0.4.26' 2024-08-14 14:10:15 +00:00
its-a-feature c79fb57a2d Few more UI fixes and tweaks around sorting tables 2024-08-14 08:55:52 -05:00
github-actions 5902a6c22a Bump Mythic Dockerfile tag to match release 'v0.0.4.25' 2024-08-13 23:02:54 +00:00
its-a-feature 25c183ac6e Callback Table, Process Browser, and File Browser updates 2024-08-13 17:48:34 -05:00
github-actions 5b04b61bb0 Bump Mythic Dockerfile tag to match release 'v0.0.4.24' 2024-08-12 18:44:13 +00:00
its-a-feature 96c61c7dfb File browser fixes 2024-08-12 13:30:09 -05:00
github-actions 69e714c96e Bump Mythic Dockerfile tag to match release 'v0.0.4.23' 2024-08-12 02:02:28 +00:00
its-a-feature cf40b2bfda More UI fixes for the file browser 2024-08-11 20:48:32 -05:00
github-actions 6dcca28fae Bump Mythic Dockerfile tag to match release 'v0.0.4.22' 2024-08-10 00:38:32 +00:00
its-a-feature c0b2709580 Merge branch 'Mythic3.3' of https://github.com/its-a-feature/Mythic into Mythic3.3 2024-08-09 19:24:08 -05:00
its-a-feature cdb7a0cd63 many updates for the file browser and callbacks table 2024-08-09 19:23:48 -05:00
github-actions 0c9b0c5fbe Bump Mythic Dockerfile tag to match release 'v0.0.4.21' 2024-08-08 20:59:17 +00:00
its-a-feature dca9444fc6 more UI tweaks and additional controls for active callbacks page 2024-08-08 15:45:21 -05:00
github-actions 271e4236a0 Bump Mythic Dockerfile tag to match release 'v0.0.4.20' 2024-08-07 20:33:12 +00:00
its-a-feature 03757a4c4e ui file preview tweaks and code alignment fixes 2024-08-07 15:19:16 -05:00
github-actions cc404823cc Bump Mythic Dockerfile tag to match release 'v0.0.4.19' 2024-08-06 22:47:25 +00:00
its-a-feature e0eab278dd update last checkin processing for linked callbacks 2024-08-06 17:33:13 -05:00
github-actions 46be2e2a9c Bump Mythic Dockerfile tag to match release 'v0.0.4.18' 2024-08-06 16:25:58 +00:00
its-a-feature 16aeafbfb6 fixing scrolling for console view and jupyter permissions 2024-08-06 11:11:24 -05:00
github-actions 1f368b4b37 Bump Mythic Dockerfile tag to match release 'v0.0.4.17' 2024-08-05 23:32:31 +00:00
its-a-feature ffb5a4f927 slight update to rpfwd timeouts 2024-08-05 18:17:58 -05:00
github-actions 8098cee611 Bump Mythic Dockerfile tag to match release 'v0.0.4.16' 2024-08-05 22:09:05 +00:00
its-a-feature 7ae5995de6 ui fixes, testProxy feature 2024-08-05 16:55:21 -05:00
github-actions c42d91edc6 Bump Mythic Dockerfile tag to match release 'v0.0.4.15' 2024-08-05 14:20:24 +00:00
its-a-feature 9aee9a3452 small ui tweaks 2024-08-05 09:06:28 -05:00
github-actions e32028964b Bump Mythic Dockerfile tag to match release 'v0.0.4.14' 2024-08-02 22:19:54 +00:00
its-a-feature 7583b78d70 updating streaming of filebrowser data 2024-08-02 17:05:18 -05:00
github-actions 28d87c5898 Bump Mythic Dockerfile tag to match release 'v0.0.4.13' 2024-08-02 18:07:35 +00:00
its-a-feature 7cc98709cc few UI tweaks and bug fixes 2024-08-02 12:53:25 -05:00
launchdaemon 7c3db07789 Update install_docker_ubuntu.sh
Check system architecture to add appropriate repository
2024-08-02 10:56:49 +01:00
launchdaemon 967bdbdb98 Update install_docker_debian.sh
Checks machine architecture to add the appropriate repository
2024-08-02 10:53:20 +01:00
github-actions a325ec1f88 Bump Mythic Dockerfile tag to match release 'v0.0.4.12' 2024-08-01 22:37:19 +00:00
its-a-feature 85f9c10617 updating mythic-cli defaults and echoing error messages from tasking 2024-08-01 17:23:24 -05:00
github-actions d80ca96dfa Bump Mythic Dockerfile tag to match release 'v0.0.4.11' 2024-07-31 22:38:52 +00:00
its-a-feature b28c918aad small fix for browser tables 2024-07-31 17:24:56 -05:00
github-actions 5cf2486f7f Bump Mythic Dockerfile tag to match release 'v0.0.4.10' 2024-07-31 21:33:04 +00:00
its-a-feature a563e0c78b more ui updates and mythic-cli additional options 2024-07-31 16:18:57 -05:00
github-actions cc7222f7ac Bump Mythic Dockerfile tag to match release 'v0.0.4.9' 2024-07-30 22:28:44 +00:00
its-a-feature 9c47d55de9 Many ui updates 2024-07-30 17:14:43 -05:00
github-actions 399b9800c3 Bump Mythic Dockerfile tag to match release 'v0.0.4.8' 2024-07-30 13:19:33 +00:00
its-a-feature 115ab27f56 quick fix for missing check with rendering browser scripts 2024-07-30 07:55:55 -05:00
github-actions 5c6aacb95c Bump Mythic Dockerfile tag to match release 'v0.0.4.7' 2024-07-30 00:12:18 +00:00
its-a-feature bdc4d2f79b many UI tweaks and updates 2024-07-29 18:58:03 -05:00
github-actions 32d9d76faa Bump Mythic Dockerfile tag to match release 'v0.0.4.6' 2024-07-29 17:32:42 +00:00
its-a-feature 07bb9f43f1 updating file browser buttons 2024-07-29 12:18:46 -05:00
github-actions 23d9ecb4dc Bump Mythic Dockerfile tag to match release 'v0.0.4.5' 2024-07-29 16:48:51 +00:00
its-a-feature a75420a272 fixing issue with postgres use_volume missing config 2024-07-29 11:34:26 -05:00
its-a-feature 9ecf431cd8 UI performance and feature updates 2024-07-29 11:24:16 -05:00
github-actions f557670077 Bump Mythic Dockerfile tag to match release 'v0.0.4.4' 2024-07-17 22:08:11 +00:00
its-a-feature c355318b03 fixing export payload config button 2024-07-17 16:52:53 -05:00
github-actions 29e0aeee5d Bump Mythic Dockerfile tag to match release 'v0.0.4.3' 2024-07-17 14:08:53 +00:00
its-a-feature a2135e93ba fixing small bug in UI when viewing C2 Profile build parameters 2024-07-17 08:54:52 -05:00
github-actions 2203c84e12 Bump Mythic Dockerfile tag to match release 'v0.0.4.2' 2024-07-14 14:51:11 +00:00
its-a-feature abf69f6e97 bug fix with mythic scripting
updating to v3.3.0-rc3
2024-07-14 09:37:21 -05:00
github-actions eea88d8860 Bump Mythic Dockerfile tag to match release 'v0.0.4.1' 2024-07-11 14:44:09 +00:00
its-a-feature b77077b06d Bug fixes for file searching and task completion 2024-07-11 09:30:00 -05:00
github-actions 5df6d0470f Bump Mythic Dockerfile tag to match release 'v0.0.4.0' 2024-07-09 23:29:12 +00:00
its-a-feature 8dbbd028da updating max container version 2024-07-09 17:51:30 -05:00
its-a-feature e6c4792151 Mythic3.3.0 Initial push 2024-07-09 17:34:09 -05:00
dependabot[bot] 4c142b8791 Bump ejs from 3.1.9 to 3.1.10 in /MythicReactUI
Bumps [ejs](https://github.com/mde/ejs) from 3.1.9 to 3.1.10.
- [Release notes](https://github.com/mde/ejs/releases)
- [Commits](https://github.com/mde/ejs/compare/v3.1.9...v3.1.10)

---
updated-dependencies:
- dependency-name: ejs
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
2024-05-02 13:58:50 +00:00
github-actions 2079bd7ff0 Bump Mythic Dockerfile tag to match release 'v0.0.3.53' 2024-04-23 14:28:50 +00:00
its-a-feature 20199e5dc3 v3.2.20-rc11
fixing small bug with syncing commands over
2024-04-23 08:59:36 -05:00
github-actions 6a43c2439b Bump Mythic Dockerfile tag to match release 'v0.0.3.52' 2024-04-10 16:08:10 +00:00
its-a-feature 918f9e2e93 v3.2.20-rc10
fixing a few errors in MythicRPC calls when fetching data from database
2024-04-10 10:53:58 -05:00
github-actions 9d8a361c48 Bump Mythic Dockerfile tag to match release 'v0.0.3.51' 2024-04-09 13:09:16 +00:00
its-a-feature 5a34ffc7c0 fixing mythic-cli issue 2024-04-09 07:55:41 -05:00
github-actions 1d2f6a5a61 Bump Mythic Dockerfile tag to match release 'v0.0.3.50' 2024-04-09 01:14:18 +00:00
its-a-feature 4ed5172b30 v3.2.20-rc9
Fixed SendMythicRPCTaskSearch and added new data sent out for logging
2024-04-08 19:59:51 -05:00
github-actions f7a002edb7 Bump Mythic Dockerfile tag to match release 'v0.0.3.49' 2024-04-05 23:09:07 +00:00
its-a-feature 8bfc904dc6 v3.2.20-rc8
fixing MythicRPC issue for generating payloads from scratch
2024-04-05 17:55:17 -05:00
github-actions f923eb17a2 Bump Mythic Dockerfile tag to match release 'v0.0.3.48' 2024-03-30 23:37:38 +00:00
its-a-feature 7535e55317 More UI array fixes
also auto select c2 profile when selecting saved c2 instance
2024-03-30 18:23:54 -05:00
github-actions 282cd32d78 Bump Mythic Dockerfile tag to match release 'v0.0.3.47' 2024-03-30 20:59:00 +00:00
its-a-feature 08c808ea33 fixing issue with parsing saved arrays from c2 instances 2024-03-30 15:45:15 -05:00
github-actions 7c0dfacba9 Bump Mythic Dockerfile tag to match release 'v0.0.3.46' 2024-03-30 15:29:26 +00:00
its-a-feature 4cf6d9d8fa fixing an issue with callbacks not getting hidden from view 2024-03-30 10:15:34 -05:00
github-actions d2786bab86 Bump Mythic Dockerfile tag to match release 'v0.0.3.45' 2024-03-30 14:40:01 +00:00
its-a-feature 7349b29e71 forgot to update the version file 2024-03-30 09:26:14 -05:00
github-actions bb0d9044ab Bump Mythic Dockerfile tag to match release 'v0.0.3.44' 2024-03-29 21:53:55 +00:00
its-a-feature 1cf8948320 v3.2.20-rc7
added more c2 profile inner server restarts in case of file changes
2024-03-29 16:30:45 -05:00
its-a-feature d7c42e739f updating broken slack invite link 2024-03-27 12:07:03 -05:00
github-actions 2cee0f7cba Bump Mythic Dockerfile tag to match release 'v0.0.3.43' 2024-03-25 19:44:15 +00:00
its-a-feature 08cdbdb312 updating UI Search features and results 2024-03-25 14:29:30 -05:00
github-actions 6936e5a3d6 Bump Mythic Dockerfile tag to match release 'v0.0.3.42' 2024-03-25 13:36:47 +00:00
its-a-feature af0dcbec44 v0.3.20-rc6
Adding PushC2OneToMany functionality
2024-03-25 08:07:42 -05:00
github-actions dfd3715409 Bump Mythic Dockerfile tag to match release 'v0.0.3.41' 2024-03-21 20:29:44 +00:00
its-a-feature df457ae7fb fixing incompatible changes in mythic-cli go docker library 2024-03-21 14:59:54 -05:00
its-a-feature bfac6643d4 initial pass for one-to-many pushc2 WIP 2024-03-21 14:41:58 -05:00
its-a-feature 19ebe8a78c fixing bug in UI experimental table filters 2024-03-21 14:35:21 -05:00
github-actions b830bd247a Bump Mythic Dockerfile tag to match release 'v0.0.3.40' 2024-03-19 23:32:09 +00:00
its-a-feature 0343bcabb0 v3.2.20-rc5
UI Bug fix with Streaming Now and alpha support for XML messages natively
2024-03-19 18:17:41 -05:00
its-a-feature b589855d06 v3.2.20-rc4
more socks debugging
2024-03-19 13:09:57 -05:00
github-actions a24d7f6be5 Bump Mythic Dockerfile tag to match release 'v0.0.3.39' 2024-03-19 16:03:48 +00:00
its-a-feature 644f6e96be v3.2.20-rc3
SOCKS and logging tweaks
2024-03-19 10:49:19 -05:00
github-actions f3564a8ad4 Bump Mythic Dockerfile tag to match release 'v0.0.3.38' 2024-03-14 19:24:59 +00:00
its-a-feature 448285f49b v3.2.20-rc2
fixed rpfwd tracking
2024-03-14 14:05:59 -05:00
github-actions d108790325 Bump Mythic Dockerfile tag to match release 'v0.0.3.37' 2024-03-08 15:33:38 +00:00
its-a-feature 23e5c2f8b1 v3.2.20-rc1
fixed issue with stat tracking for new socks/rpfwd ports
2024-03-08 09:16:32 -06:00
github-actions 5b67741a0f Bump Mythic Dockerfile tag to match release 'v0.0.3.36' 2024-03-06 20:47:30 +00:00
its-a-feature e204be77e5 fixing UI task button bug 2024-03-06 14:33:01 -06:00
github-actions a8b8bfb76c Bump Mythic Dockerfile tag to match release 'v0.0.3.35' 2024-03-06 14:16:41 +00:00
its-a-feature 56846d2278 v3.2.19
Adding more fields to tasking callback data and adding try/catch for slider parsing on the dashboard
2024-03-06 08:02:31 -06:00
github-actions 2068749e81 Bump Mythic Dockerfile tag to match release 'v0.0.3.34' 2024-03-05 00:18:01 +00:00
its-a-feature 2970729709 v3.2.18-rc10
UI bug fixes and agent_type support added in
2024-03-04 18:03:37 -06:00
github-actions 287e95990b Bump Mythic Dockerfile tag to match release 'v0.0.3.33' 2024-02-29 21:57:08 +00:00
its-a-feature 43f11e5a4e v0.0.3.33
UI Fixes for files search upload/download/screenshot page
2024-02-29 15:42:55 -06:00
github-actions 84a68d94ad Bump Mythic Dockerfile tag to match release 'v0.0.3.32' 2024-02-29 21:28:37 +00:00
its-a-feature bfcf5c2a7c v0.0.3.32
UI Updates
2024-02-29 15:14:08 -06:00
github-actions 105fd5c36a Bump Mythic Dockerfile tag to match release 'v0.0.3.31' 2024-02-28 23:36:33 +00:00
its-a-feature b43b2b3fb7 Merge branch 'master' of https://github.com/its-a-feature/Mythic 2024-02-28 17:21:40 -06:00
its-a-feature 59e9a9efc4 v3.2.18-rc9
UI Fixes/updates and updating server to respond successfully even if post response data fails to process
2024-02-28 17:21:37 -06:00
github-actions ad82245016 Bump Mythic Dockerfile tag to match release 'v0.0.3.30' 2024-02-26 13:42:30 +00:00
its-a-feature f941848f60 v3.2.18-rc8
various UI fixes
2024-02-26 06:25:27 -07:00
github-actions 85b1cdf5ae Bump Mythic Dockerfile tag to match release 'v0.0.3.29' 2024-02-21 22:36:53 +00:00
its-a-feature 29b3c89948 v3.2.18-rc7
Added `import` and `export` features to c2 profile instances
2024-02-21 16:22:12 -06:00
github-actions 21f799de67 Bump Mythic Dockerfile tag to match release 'v0.0.3.28' 2024-02-20 21:04:31 +00:00
its-a-feature c3cf3f986f updating mythic-cli
fixing bug with documentation container for wrapper payloads
2024-02-20 14:50:26 -06:00
github-actions d11cdecf48 Bump Mythic Dockerfile tag to match release 'v0.0.3.27' 2024-02-19 20:10:01 +00:00
its-a-feature b6f60329a1 v3.2.18-rc6
updated a check for parent-path parsing in file browser data
2024-02-19 13:56:14 -06:00
github-actions d130595be7 Bump Mythic Dockerfile tag to match release 'v0.0.3.26' 2024-02-19 18:39:31 +00:00
its-a-feature 28f6acbc93 Fixing experimental callbacks table rendering 2024-02-19 12:24:15 -06:00
github-actions 5dda200b1f Bump Mythic Dockerfile tag to match release 'v0.0.3.25' 2024-02-16 23:15:09 +00:00
its-a-feature 0a69f83969 UI fixes and slight server update 2024-02-16 16:58:08 -06:00
github-actions 9af5b64770 Bump Mythic Dockerfile tag to match release 'v0.0.3.24' 2024-02-15 14:29:46 +00:00
its-a-feature b5cfc05dae Merge branch 'master' of https://github.com/its-a-feature/Mythic 2024-02-15 08:15:24 -06:00
its-a-feature fd71b1c752 fixing UI bug with media output types 2024-02-15 08:15:20 -06:00
github-actions 02e3f5f53a Bump Mythic Dockerfile tag to match release 'v0.0.3.23' 2024-02-15 00:15:42 +00:00
its-a-feature c9c2aaccc2 fixing UI multi-tasking bug
updated callbacks table with new table when experimental setting flipped
2024-02-14 18:01:40 -06:00
github-actions 76c929d244 Bump Mythic Dockerfile tag to match release 'v0.0.3.22' 2024-02-14 17:30:23 +00:00
its-a-feature 0a51910ce0 UI bug fixes 2024-02-14 11:15:50 -06:00
github-actions 4c5efe84b2 Bump Mythic Dockerfile tag to match release 'v0.0.3.21' 2024-02-14 00:28:10 +00:00
its-a-feature 5b112635c9 updating mythic-cli to remove react ui volume as necessary
also fixing bad golang type when installing services
2024-02-13 18:13:14 -06:00
github-actions 643aaf472b Bump Mythic Dockerfile tag to match release 'v0.0.3.20' 2024-02-13 23:25:37 +00:00
its-a-feature d40e3a57b5 fixing bug in UI for choosing commands 2024-02-13 17:11:52 -06:00
github-actions e7e00b4b7f Bump Mythic Dockerfile tag to match release 'v0.0.3.19' 2024-02-13 22:48:45 +00:00
its-a-feature a706381ca0 updating mythic-cli labels and logging 2024-02-13 16:34:42 -06:00
github-actions 7ee5676630 Bump Mythic Dockerfile tag to match release 'v0.0.3.18' 2024-02-13 21:53:53 +00:00
its-a-feature ce2843b801 v3.2.18-rc4
adding user secrets, updating callback imports, tweaking socks
2024-02-13 15:32:36 -06:00
github-actions d6c32d0681 Bump Mythic Dockerfile tag to match release 'v0.0.3.17' 2024-02-11 02:34:08 +00:00
its-a-feature dcebe2686a updating psotgres connection data
updating mythic-cli to add command for postgres connection
2024-02-10 20:18:33 -06:00
github-actions 0bd89aca4b Bump Mythic Dockerfile tag to match release 'v0.0.3.16' 2024-02-11 00:01:23 +00:00
its-a-feature d7924f966d mythic-cli updates for better handling of postgres ports
updating postgres' dockerfile to properly expose changed ports
2024-02-10 17:47:12 -06:00
github-actions 774ea60b78 Bump Mythic Dockerfile tag to match release 'v0.0.3.15' 2024-02-10 03:15:26 +00:00
its-a-feature ed464263cb fixing postgres port bug 2024-02-09 21:01:24 -06:00
github-actions 63c3af046d Bump Mythic Dockerfile tag to match release 'v0.0.3.14' 2024-02-09 23:18:37 +00:00
its-a-feature cc9169d91a v3.2.18-rc3 2024-02-09 16:56:19 -06:00
github-actions c9b9f94b75 Bump Mythic Dockerfile tag to match release 'v0.0.3.13' 2024-02-08 18:37:02 +00:00
its-a-feature d71fe73fee v3.2.18-rc2
fixed issue with sometimes task status not getting updated when also setting complete
2024-02-08 12:22:36 -06:00
its-a-feature 4c1c28da66 updating version to make mythic-cli happy 2024-02-08 11:33:43 -06:00
github-actions 81b298793d Bump Mythic Dockerfile tag to match release 'v0.0.3.12' 2024-02-08 16:35:29 +00:00
its-a-feature 3ee407b1d9 v3.2.17.1
added some better checking and deadlock preventing checks around socks traffic
2024-02-08 10:20:08 -06:00
github-actions c23998affc Bump Mythic Dockerfile tag to match release 'v0.0.3.11' 2024-02-07 20:19:21 +00:00
its-a-feature f5890049fa updating mythic-cli for better local-building
updating UI plaintext view to be more streamlined
2024-02-07 13:53:14 -06:00
github-actions c3d443ea91 Bump Mythic Dockerfile tag to match release 'v0.0.3.10' 2024-02-07 14:17:50 +00:00
its-a-feature 25afd25cc0 fixing mythic-cli typo breaking fresh installs 2024-02-07 08:03:07 -06:00
github-actions 59de20dac7 Bump Mythic Dockerfile tag to match release 'v0.0.3.9' 2024-02-06 21:32:59 +00:00
its-a-feature af58bc9dbc v3.2.17
bug fixes and new features for mythic-cli, mythic_server, and the UI
2024-02-06 15:04:04 -06:00
github-actions 2aa0c39888 Bump Mythic Dockerfile tag to match release 'v0.0.3.8' 2024-01-31 00:25:12 +00:00
its-a-feature 93cec09443 updating mythic-cli copying without -it for non TTYs 2024-01-30 16:12:09 -08:00
github-actions 29758798d1 Bump Mythic Dockerfile tag to match release 'v0.0.3.7' 2024-01-30 23:56:40 +00:00
its-a-feature eadb076f0b updating mythic-cli for handling non-tty install 2024-01-30 15:43:39 -08:00
github-actions 7e27b82f9f Bump Mythic Dockerfile tag to match release 'v0.0.3.6' 2024-01-29 22:55:38 +00:00
its-a-feature 43ccf85cbe fixing a bad link on the dashboard page for users/hosts 2024-01-29 14:42:54 -08:00
github-actions 1c903809ea Bump Mythic Dockerfile tag to match release 'v0.0.3.5' 2024-01-29 21:59:04 +00:00
its-a-feature ebef87de60 update mythic-cli to remove old volume when adding 3rd party services 2024-01-29 13:46:44 -08:00
github-actions 34ab89cc99 Bump Mythic Dockerfile tag to match release 'v0.0.3.4' 2024-01-29 20:08:44 +00:00
its-a-feature bab908ccf1 updated mythic-cli to not report no matching keys and success 2024-01-29 11:09:53 -08:00
its-a-feature c855cb2e0e updated mythic-cli's regex matching for getting/setting env variables 2024-01-29 11:06:34 -08:00
github-actions 3a8ed471e9 Bump Mythic Dockerfile tag to match release 'v0.0.3.3' 2024-01-29 16:14:52 +00:00
its-a-feature e73ab8ee56 UI and mythic-cli fixes 2024-01-29 07:51:12 -08:00
github-actions e90a5559be Bump Mythic Dockerfile tag to match release 'v0.0.3.2' 2024-01-29 01:18:34 +00:00
its-a-feature 5240ad3f6a updating to push updates to master branch 2024-01-28 17:06:05 -08:00
its-a-feature 96563b2978 updated mythic-cli
better mythic-cli support for mythic_graphql volumes
2024-01-28 16:46:12 -08:00
Cody Thomas 30856d7d4e Merge pull request #361 from its-a-feature/docker_updates
Docker updates
2024-01-28 16:37:00 -06:00
github-actions 3f574ee907 Bump Mythic Dockerfile tag to match release 'v0.0.3' 2024-01-28 22:34:47 +00:00
its-a-feature 16c1441933 updated github action versions 2024-01-28 14:06:09 -08:00
its-a-feature d55dffcb77 getting ready for merge 2024-01-28 13:47:49 -08:00
github-actions 05d4fb1b2e Bump Mythic Dockerfile tag to match release 'v0.0.3-rc4' 2024-01-28 13:28:48 -08:00
its-a-feature 7777a42d02 updating volume mapping for the mythic_server container 2024-01-28 13:28:48 -08:00
github-actions 08832392db Bump Mythic Dockerfile tag to match release 'v0.0.3-rc3' 2024-01-28 13:28:48 -08:00
its-a-feature e718cb2849 updating mythic-cli to reflect .env changes for 3rd party services 2024-01-28 13:28:48 -08:00
github-actions 935280d89b Bump Mythic Dockerfile tag to match release 'v0.0.3-rc2' 2024-01-28 13:28:48 -08:00
its-a-feature 92761feba3 updating volume listing 2024-01-28 13:28:48 -08:00
github-actions d5b274850a Bump Mythic Dockerfile tag to match release 'v0.0.3-rc1' 2024-01-28 13:28:48 -08:00
github-actions 6b49430d11 Bump Mythic Dockerfile tag to match release 'v0.0.1-rc1' 2024-01-28 13:28:48 -08:00
its-a-feature d324ecd02e updated workflow to build on tags 2024-01-28 13:28:48 -08:00
its-a-feature ae72af73fc updated mythic-cli for remote agent installs 2024-01-28 13:28:48 -08:00
github-actions 6d7107fc47 Bump Mythic Dockerfile tag to match release 'v0.0.2.54' 2024-01-28 13:28:48 -08:00
its-a-feature d473e1dde7 v0.0.2.54 2024-01-28 13:28:48 -08:00
github-actions a0cff4aa18 Bump Mythic Dockerfile tag to match release 'v0.0.2.53' 2024-01-28 13:28:48 -08:00
its-a-feature a98b87b0fa v0.0.2.53 2024-01-28 13:28:48 -08:00
github-actions a7bddedaa5 Bump Mythic Dockerfile tag to match release 'v0.0.2.52' 2024-01-28 13:28:48 -08:00
its-a-feature cd8a936652 v0.0.2.52 2024-01-28 13:28:48 -08:00
github-actions 988f0ec586 Bump Mythic Dockerfile tag to match release 'v0.0.2.51' 2024-01-28 13:28:48 -08:00
its-a-feature 4fc9312ceb v0.0.2.51 2024-01-28 13:28:48 -08:00
github-actions c44cebdc8a Bump Mythic Dockerfile tag to match release 'v0.0.2.50' 2024-01-28 13:28:48 -08:00
its-a-feature 1b498d7efa v0.0.2.50 2024-01-28 13:28:48 -08:00
github-actions 7764a64f2d Bump Mythic Dockerfile tag to match release 'v0.0.2.49' 2024-01-28 13:28:48 -08:00
its-a-feature 3993a4789b v0.0.2.49 2024-01-28 13:28:48 -08:00
github-actions c35bc0bc7e Bump Mythic Dockerfile tag to match release 'v0.0.2.48' 2024-01-28 13:28:48 -08:00
its-a-feature 9ac8b9fdbb v0.0.2.48 2024-01-28 13:28:48 -08:00
github-actions 068db9aaa6 Bump Mythic Dockerfile tag to match release 'v0.0.2.47' 2024-01-28 13:28:48 -08:00
its-a-feature ca81cc2676 v0.0.2.47 2024-01-28 13:28:48 -08:00
its-a-feature 8d12221e74 v0.0.2.46 2024-01-28 13:28:48 -08:00
github-actions 9224f66570 Bump Mythic Dockerfile tag to match release 'v0.0.2.45' 2024-01-28 13:28:48 -08:00
its-a-feature 6467625f71 v0.0.2.45 2024-01-28 13:28:48 -08:00
its-a-feature 247b502eb5 v0.0.2.44 2024-01-28 13:28:48 -08:00
its-a-feature bea2477e83 v0.0.2.43 2024-01-28 13:28:48 -08:00
its-a-feature 6d43ebe1b2 v0.0.2.42 2024-01-28 13:28:48 -08:00
its-a-feature 7a3792046d v0.0.2.41 2024-01-28 13:28:48 -08:00
github-actions 6614779ff0 Bump Mythic Dockerfile tag to match release 'v0.0.2.40' 2024-01-28 13:28:48 -08:00
its-a-feature 9e74ef10a1 v0.0.2.40 2024-01-28 13:28:48 -08:00
github-actions ea2f978ff6 Bump Mythic Dockerfile tag to match release 'v0.0.2.39' 2024-01-28 13:28:48 -08:00
its-a-feature 7134d24564 v0.0.2.39 2024-01-28 13:28:48 -08:00
its-a-feature 92fb9c913f v0.0.2.39 2024-01-28 13:28:48 -08:00
github-actions e215a2685f Bump Mythic Dockerfile tag to match release 'v0.0.2.38' 2024-01-28 13:28:48 -08:00
its-a-feature 2f52bb066f v0.0.2.38 2024-01-28 13:28:48 -08:00
github-actions 1e9fabc823 Bump Mythic Dockerfile tag to match release 'v0.0.2.37' 2024-01-28 13:28:48 -08:00
its-a-feature 1c5d46f76d v0.0.2.37 2024-01-28 13:28:48 -08:00
its-a-feature e942f27d57 v0.0.2.36 2024-01-28 13:28:48 -08:00
github-actions 22a835e714 Bump Mythic Dockerfile tag to match release 'v0.0.2.35' 2024-01-28 13:28:48 -08:00
its-a-feature 0328ea93ef v0.0.2.35 2024-01-28 13:28:48 -08:00
github-actions 2a32829539 Bump Mythic Dockerfile tag to match release 'v0.0.2.34' 2024-01-28 13:28:48 -08:00
its-a-feature 65778fbeb5 v0.0.2.34 2024-01-28 13:28:48 -08:00
its-a-feature a23ef50ec5 mythic-cli refactor 2024-01-28 13:28:48 -08:00
its-a-feature 8ba09a3b08 mythic-cli refactor 2024-01-28 13:28:48 -08:00
its-a-feature 9785b2fa2c refactor and updated docker-compose to remove "networks" 2024-01-28 13:28:48 -08:00
github-actions b263553054 Bump Mythic Dockerfile tag to match release 'v0.0.2.33' 2024-01-28 13:28:48 -08:00
its-a-feature 12ae0b8007 v0.0.2.33 2024-01-28 13:28:48 -08:00
github-actions f5836274d6 Bump Mythic Dockerfile tag to match release 'v0.0.2.32' 2024-01-28 13:28:48 -08:00
its-a-feature 61ff6bb4cf v0.0.2.32 2024-01-28 13:28:48 -08:00
github-actions 6a1d731e46 Bump Mythic Dockerfile tag to match release 'v0.0.2.31' 2024-01-28 13:28:48 -08:00
its-a-feature 09a0a425a0 v0.0.2.31 2024-01-28 13:28:48 -08:00
github-actions e0195ff459 Bump Mythic Dockerfile tag to match release 'v0.0.2.30' 2024-01-28 13:28:48 -08:00
its-a-feature 9d5839377f v0.0.2.30 2024-01-28 13:28:48 -08:00
github-actions cbe246259b Bump Mythic Dockerfile tag to match release 'v0.0.2.29' 2024-01-28 13:28:48 -08:00
its-a-feature eb4f900ec9 v0.0.2.29 2024-01-28 13:28:48 -08:00
github-actions 802e08a3c1 Bump Mythic Dockerfile tag to match release 'v0.0.2.28' 2024-01-28 13:28:48 -08:00
its-a-feature 41e4444752 v0.0.2.28 2024-01-28 13:28:48 -08:00
its-a-feature 0b6bf750f7 v0.0.2.27 2024-01-28 13:28:48 -08:00
github-actions 92c81d2b9d Bump Mythic Dockerfile tag to match release 'v0.0.2.26' 2024-01-28 13:28:48 -08:00
its-a-feature ab41e274e3 v0.0.2.26 2024-01-28 13:28:48 -08:00
its-a-feature bba777eeb6 v0.0.2.25 2024-01-28 13:28:48 -08:00
its-a-feature f3eb9e0409 v0.0.2.24 2024-01-28 13:28:48 -08:00
github-actions 6958287365 Bump Mythic Dockerfile tag to match release 'v0.0.2.23' 2024-01-28 13:28:48 -08:00
its-a-feature 506423b454 v0.0.2.23 2024-01-28 13:28:48 -08:00
its-a-feature 4ea4873fd0 v0.0.2.22 2024-01-28 13:28:48 -08:00
github-actions 7e6bd56627 Bump Mythic Dockerfile tag to match release 'v0.0.2.21' 2024-01-28 13:28:48 -08:00
its-a-feature 8e8e8b9847 v0.0.2.21 2024-01-28 13:28:48 -08:00
github-actions 61ed98b5e8 Bump Mythic Dockerfile tag to match release 'v0.0.2.20' 2024-01-28 13:28:48 -08:00
its-a-feature 7312e83d9e v0.0.2.20 2024-01-28 13:28:48 -08:00
github-actions 8fecceefc1 Bump Mythic Dockerfile tag to match release 'v0.0.2.19' 2024-01-28 13:28:48 -08:00
its-a-feature c58f881e32 v0.0.2.19 2024-01-28 13:28:48 -08:00
github-actions 41334987b1 Bump Mythic Dockerfile tag to match release 'v0.0.2.18' 2024-01-28 13:28:48 -08:00
its-a-feature b64e82af36 v0.0.2.18 2024-01-28 13:28:48 -08:00
github-actions 3fd5d13e9e Bump Mythic Dockerfile tag to match release 'v0.0.2.17' 2024-01-28 13:28:48 -08:00
its-a-feature 23e8ec7177 v0.0.2.17 2024-01-28 13:28:48 -08:00
github-actions cdbdfeee9e Bump Mythic Dockerfile tag to match release 'v0.0.2.16' 2024-01-28 13:28:48 -08:00
its-a-feature b42a3a858e v0.0.2.16 2024-01-28 13:28:48 -08:00
github-actions 295656d024 Bump Mythic Dockerfile tag to match release 'v0.0.2.15' 2024-01-28 13:28:48 -08:00
its-a-feature f1ff005a71 v0.0.2.15 2024-01-28 13:28:48 -08:00
github-actions d9de7df078 Bump Mythic Dockerfile tag to match release 'v0.0.2.14' 2024-01-28 13:28:48 -08:00
its-a-feature e51f6a0120 v0.0.2.14 2024-01-28 13:28:48 -08:00
its-a-feature 52d7a5fe92 v0.0.2.13 2024-01-28 13:28:48 -08:00
github-actions bcf52da14f Bump Mythic Dockerfile tag to match release 'v0.0.2.12' 2024-01-28 13:28:48 -08:00
its-a-feature 879f2e0255 v0.0.2.12 2024-01-28 13:28:48 -08:00
github-actions 08bed7e519 Bump Mythic Dockerfile tag to match release 'v0.0.2.11' 2024-01-28 13:28:48 -08:00
its-a-feature 07e9504a9e v0.0.2.11 2024-01-28 13:28:48 -08:00
github-actions 996b67a4eb Bump Mythic Dockerfile tag to match release 'v0.0.2.10' 2024-01-28 13:28:48 -08:00
its-a-feature 814fd240da v0.0.2.10 2024-01-28 13:28:48 -08:00
github-actions 535763f829 Bump Mythic Dockerfile tag to match release 'v0.0.2.9' 2024-01-28 13:28:48 -08:00
its-a-feature 0b65728111 v0.0.2.9 2024-01-28 13:28:48 -08:00
github-actions 84e6c6eecc Bump Mythic Dockerfile tag to match release 'v0.0.2.8' 2024-01-28 13:28:48 -08:00
its-a-feature 59479bc5ed v0.0.2.8 2024-01-28 13:28:48 -08:00
its-a-feature d9924e9a29 v0.0.2.7 2024-01-28 13:28:48 -08:00
github-actions c38f804ec7 Bump Mythic Dockerfile tag to match release 'v0.0.2.6' 2024-01-28 13:28:48 -08:00
its-a-feature 29705ad192 v0.0.2.6 2024-01-28 13:28:48 -08:00
github-actions 9560f418cb Bump Mythic Dockerfile tag to match release 'v0.0.2.5' 2024-01-28 13:28:48 -08:00
its-a-feature 9210c1fce8 v0.0.2.5 2024-01-28 13:28:48 -08:00
its-a-feature a825f80d58 v0.0.2.4 2024-01-28 13:28:48 -08:00
github-actions d3af1c339e Bump Mythic Dockerfile tag to match release 'v0.0.2.3' 2024-01-28 13:28:48 -08:00
its-a-feature a3e4255c43 v0.0.2.3 2024-01-28 13:28:48 -08:00
its-a-feature a73cf37c44 v0.0.2.2
latest
2024-01-28 13:28:48 -08:00
its-a-feature 34ddcc6c55 v0.0.2.1 2024-01-28 13:28:48 -08:00
github-actions 1a9ffa0b69 Bump Mythic Dockerfile tag to match release 'v0.0.2' 2024-01-28 13:28:48 -08:00
its-a-feature 2c1421fc59 v0.0.2 2024-01-28 13:28:48 -08:00
its-a-feature 0f9ed1d3e5 v0.0.1 2024-01-28 13:28:48 -08:00
its-a-feature 518f5e9e96 changing back to message
v0.0.1
2024-01-28 13:28:48 -08:00
its-a-feature b6318c66eb v0.0.1
fixing version to use summary instead of message
2024-01-28 13:28:48 -08:00
its-a-feature 0f9c74e966 v0.0.1
fixing git add workflow
2024-01-28 13:28:48 -08:00
its-a-feature 53633be81a v0.0.1 2024-01-28 13:28:48 -08:00
its-a-feature 22c965f8d9 v0.0.1 2024-01-28 13:28:48 -08:00
its-a-feature 6b24b4122a v0.0.2 2024-01-28 13:28:48 -08:00
its-a-feature 4ef90f1796 v0.0.1 2024-01-28 13:28:48 -08:00
its-a-feature e80fe95256 v3.2.16
New UI features and bug fixes
2024-01-28 13:15:16 -08:00
its-a-feature fdcfe27137 UI v0.1.58
fixing an issue with mismatched parameter names in modal populations
2024-01-22 13:44:50 -06:00
its-a-feature 6e4d6a74d0 UI v0.1.57
Quick fix for date field when building agents
2024-01-17 16:30:40 -06:00
its-a-feature 360d954263 UI v0.1.56 2024-01-15 12:03:09 -06:00
its-a-feature 7f19d4bfe9 v0.3.2.15
Added a way to toggle the agent debug message setting from the UI
2024-01-15 11:43:33 -06:00
its-a-feature cb1cc78f6a UI v0.1.54 2024-01-14 09:26:53 -06:00
its-a-feature 900a3006ea UI v0.1.53
fixing issue with adding new typed array entries in the modal
2024-01-13 19:09:04 -06:00
its-a-feature ea3cf4762e v3.2.14 2024-01-11 15:03:47 -06:00
its-a-feature 444a7ceae2 v3.2.13 2024-01-11 14:54:57 -06:00
its-a-feature 84852f1df9 v3.2.12
Added new MythicRPC* functions and onNewCallback functionality
2024-01-10 18:17:42 -06:00
its-a-feature ccc9472243 UI v0.1.51 2024-01-09 12:09:40 -06:00
its-a-feature 83e424911f UI v0.1.50
Dashboard tweaks for the UI and slight console view tweaks
2024-01-09 10:58:35 -06:00
its-a-feature 7ef188098a UI v0.1.48
Initial update for a dashboard on the Mythic home page
2024-01-08 15:41:17 -06:00
its-a-feature 2b2e811267 UI v0.1.48
Added a check with login form to not parse non200 response codes
2024-01-04 16:00:12 -06:00
its-a-feature a5e22a3dea v3.2.11
small bug fixes
2024-01-04 15:22:34 -06:00
its-a-feature 965cd36140 UI v0.1.47
fixing a few graph bugs and adding more context menu options for graphs
2024-01-03 13:00:38 -06:00
its-a-feature bbaadb99d8 UI v0.1.46
fixing UI bug in split tasking with subtasks
2024-01-03 08:30:10 -06:00
its-a-feature 26e6b478ba UI v0.1.45
testing out "console-like" view for tasking via callback dropdown
2023-12-29 12:15:14 -06:00
its-a-feature 9c26a92c5c updating kali install script 2023-12-28 17:13:08 -06:00
its-a-feature bd191693d6 UI v0.1.44
Allow valid UUID values for File parameter types when submitting on command line
2023-12-27 15:42:13 -06:00
its-a-feature 199de9e71c UI v0.1.43
Updated Payload Types/ C2Profiles page to be a table
2023-12-27 15:02:31 -06:00
its-a-feature cb1440120c v3.2.10
fixed an issue with interactive tasking with no port open
2023-12-26 12:55:35 -06:00
its-a-feature a738d14d89 v3.2.9
fixing some go 1.21 GOPROXY changes
2023-12-26 11:14:31 -06:00
its-a-feature 361f3d41c6 ui v0.1.42
fixed issue with task multiple double casting strings
2023-12-25 15:52:06 -06:00
its-a-feature 0a12bc54fc UI v0.1.41
fixed issue with last checkin time stamp and added ip to dialogs
2023-12-24 19:28:47 -06:00
its-a-feature 78c250d78c updating UI to v0.1.40
Updated the hide multiple and task multiple modals to use paginated tables instead of transfer lists
2023-12-24 10:44:28 -06:00
its-a-feature 1c16d2f166 fixed broken link and updated description for proxies 2023-12-22 09:09:28 -06:00
its-a-feature 91ec135d61 v3.2.8
adding missing hasura files for updating operator settings
2023-12-21 18:26:04 -06:00
its-a-feature 42a9fbc4b7 v3.2.7
Added option for port tracking with socks/rpfwd commands within agents
2023-12-21 12:28:47 -06:00
its-a-feature a720967889 v3.2.6
fixed bug in PR for refactoring RSA
2023-12-20 17:14:46 -06:00
its-a-feature 5ac5ff5ae2 v3.2.5
bumping package versions
2023-12-19 10:13:08 -06:00
Cody Thomas 52ac9306f6 Merge pull request #285 from Edznux/edz-refactor-1
Refactor of util_agent_message_actions_staging_rsa.go
2023-12-15 11:02:11 -06:00
Cody Thomas 12759e8b88 Merge pull request #305 from Edznux/refactor-authentication
Refactor authentication
2023-12-15 10:47:21 -06:00
its-a-feature 82a9c3f459 v3.2.4 and UI v.0.1.38
Many bug fixes in UI and QoL updates
2023-12-14 17:14:53 -06:00
its-a-feature 36ccd7f263 v3.2.3 2023-12-12 12:43:43 -06:00
its-a-feature cae3db6f4a UI v0.1.36
New file browser/process browser menu options to task different callbacks
2023-12-04 16:03:01 -06:00
its-a-feature 970a66d618 UI v0.1.35
fixed a few small bugs in the callback's table filtering
2023-11-23 07:53:25 -06:00
its-a-feature 35c158ad60 UI and migration updates 2023-11-22 15:45:31 -06:00
its-a-feature 5be01669fe UI v0.1.33
added sorting to the group/host fields in the file browser / process browser
2023-11-21 10:40:23 -06:00
its-a-feature d9a4ea0efc UI v0.1.32
fixed IP sorting and persistent custom tab descriptions
2023-11-21 09:59:34 -06:00
its-a-feature 3adbcd0e43 v3.2.2
bug fix
2023-11-17 10:11:50 -06:00
its-a-feature cf01b04356 v3.2.1
fixed TOCTTOU bug with paralellized file downloads
2023-11-17 09:35:25 -06:00
its-a-feature e84aadb0cf UI hotfix 2023-11-17 09:08:57 -06:00
its-a-feature a5992d7902 UI hotfix 2023-11-17 09:00:09 -06:00
its-a-feature cbcac99abe UI hotfix for v3.2.0
UI fix for migrated tree data with no callbacks associated
2023-11-17 08:13:39 -06:00
its-a-feature cd71a2fe20 hotfix
removing unnecessary staging file
2023-11-17 07:53:45 -06:00
its-a-feature 71c8eca780 v3.2.0
bug fixes and new mythictree_groupings
2023-11-17 07:51:29 -06:00
its-a-feature 3d07c8f942 v3.1.7
Added support for parallelized file chunk downloads
2023-11-13 09:57:18 -06:00
its-a-feature ed362c683f UI tweak
added new File C2 view to callback metadata as well
2023-11-09 13:40:34 -06:00
its-a-feature 1746386e06 v3.1.6
UI fixes and File support for C2 parameters
2023-11-09 09:09:45 -06:00
its-a-feature 58ef1d25a5 update UI to 0.1.25 2023-11-06 11:30:34 -06:00
Cody Thomas 9962d7376c Merge pull request #323 from mattreduce/fix-make-macos
Run `build_all_macos` from `make macos`
2023-10-31 17:25:53 -05:00
its-a-feature 36c1ad3b29 updating UI component versions and mythic-cli golang packages 2023-10-31 17:25:17 -05:00
its-a-feature 00b7b635fb fixed ui bug if parameter types change after instance already created 2023-10-20 13:08:53 -05:00
its-a-feature 5bf1cd8425 updated UI to reduce animations 2023-10-16 11:38:48 -05:00
its-a-feature aef8d03791 v3.1.5
Updated socks/rpfwd to better ensure message order
2023-10-16 10:48:12 -05:00
its-a-feature 2aca5db28b bumping go.mod versions 2023-10-12 09:55:48 +02:00
its-a-feature 0fe689086e v3.1.4
fix lock issues with checking for containers online
2023-10-12 09:24:00 +02:00
its-a-feature 59a905cee2 fix date picker change in UI 2023-10-10 19:46:26 +02:00
its-a-feature c8158902e1 fixing date-picker problem in UI 2023-10-10 19:35:08 +02:00
its-a-feature 51a12c2c48 fixed bug in UI where debug notifications were still causing toasts 2023-10-07 10:31:08 -05:00
its-a-feature 569676046f Fixing c2 profile parameter instance bug in UI 2023-10-06 16:56:38 -05:00
its-a-feature 8881994004 v3.1.3
fixed bug in interactive task ports and updated ui for skip steps toast notifications
2023-10-04 10:37:43 -05:00
its-a-feature ab167c0f49 fixing dependabot yml 2023-10-03 17:32:12 -05:00
its-a-feature 3c99f2cdf3 adding dependabot configuration 2023-10-03 17:31:13 -05:00
its-a-feature 08e24272df bumped UI/server package versions
also fixed small issue in UI for interactive tasks not updating output consistently
2023-10-03 17:20:47 -05:00
its-a-feature 94806a633d v3.1.2
channel close bug fix
2023-10-03 16:43:50 -05:00
its-a-feature ea31698a62 updated C2RPC Generate Redirector Rules call
added more comment characters to improve general usage in .htaccess files
2023-10-03 14:24:17 -05:00
its-a-feature 3e1c71672e v3.1.0 2023-10-03 10:59:43 -05:00
its-a-feature d6d05b11d2 v3.0.1-rc46
Updated the task search MythicRPC and nginx reverse proxy
2023-08-22 16:41:12 -05:00
Matthew Conway 0c034fbfd2 Run build_all_macos from make macos
Ensures mythic-cli image is built locally before trying to use it to
build the CLI on macOS
2023-08-06 16:19:18 -07:00
its-a-feature 6bac1e65c2 updating mythic ui to fix zip download bug
when downloading a zip of files, the check all button would mark deleted files for download too, this skips those files
2023-07-20 17:15:43 -05:00
its-a-feature 16511efca6 updating mythic-cli
adding env options for restricting memory limits of various services
2023-07-20 14:20:24 -05:00
its-a-feature a13cb6ed64 v3.0.1-rc45
fixed a sql query issue with linked agents
2023-07-20 10:54:49 -05:00
its-a-feature 29a240a1f1 updated mythic-cli docker compose subnet usage
mythic-cli no longer adds a custom subnet for mythic's docker-compose
2023-07-19 18:32:07 -05:00
its-a-feature c613be1d6a updating ui
dynamic query functions now also support up-arrow modal completion
2023-07-19 10:34:39 -05:00
its-a-feature 860bfb1635 v3.0.1-rc44
updating mythic UI and adding docker go build args for mythic-docker and mythic-cli
2023-07-18 14:33:33 -05:00
its-a-feature 57626f6c0b updated mythic-cli to not bail in certain scenarios
no more exit call for failing to read in newly created docker-compose file, it'll be empty anyway
2023-07-18 11:29:46 -05:00
its-a-feature e4b0773b81 v3.0.1-rc43
fixed an issue with zip downloading multiple files with the same name
2023-07-18 08:19:41 -05:00
its-a-feature 00dec99a23 v3.0.1-rc42
updated MythicRPCCallbackUpdate to work with taskID properly
2023-07-17 17:45:22 -05:00
its-a-feature fcc150984f updated UI
payload creation notification goes away if you leave the build page
2023-07-17 08:31:24 -05:00
its-a-feature be6232e718 v3.0.1-rc41
fixed an issue where every delegate message created a new tracked link
2023-07-16 13:09:42 -05:00
its-a-feature 79b1ea5180 v3.0.1-rc40
fixed some issues with p2p tokens and links 3+ long
2023-07-15 08:32:50 -05:00
its-a-feature 2655a81676 v3.0.1-rc39
adjusted agent message processing to accept messages between 16 and 36 characters
2023-07-14 08:02:43 -05:00
its-a-feature 7e68ace90f v3.0.1-rc38
updated more of the rabbitmq connections
2023-07-12 14:19:34 -05:00
its-a-feature a31556be11 v3.0.1-rc37
added missing return statements to a few error cases
2023-07-12 09:31:02 -05:00
its-a-feature e740d7c750 v3.0.1-rc36
Fixed a few of the RPC calls that had bad postgres query syntax
2023-07-11 09:22:50 -05:00
its-a-feature 783894ebb7 fixed small bug in ui for mass tasking
removed extra "task" button for mass tasking modal
2023-07-10 16:39:17 -05:00
its-a-feature d7c4a12b80 v3.0.1-rc35
Updated UI and server for easier mass tasking, mass hiding of callbacks, and fixes for a few rabbitmq bugs
2023-07-10 12:31:28 -05:00
its-a-feature 6c290f85f3 fixed process browser sort issue 2023-07-05 19:08:43 -05:00
its-a-feature 2d2a5cb164 v3.0.1-rc34
updated file downloads to not un-set `is_screenshot` data
2023-07-05 13:04:18 -05:00
its-a-feature 257ea4c2e6 fix UI time for non-US viewers 2023-07-05 12:10:30 -05:00
its-a-feature 46e7a31014 updating mythic-cli
adding `services` command to list out information about installed services
2023-07-05 10:53:50 -05:00
its-a-feature 01660debc2 v3.0.1-rc33
Updated file browser to highlight folders with children
2023-07-05 09:07:28 -05:00
its-a-feature ca96083715 v3.0.1-rc32
only ask translation container for encryption keys if it does encryption
2023-06-30 09:46:49 -05:00
its-a-feature bca58b2c5b v3.0.1-rc31
Updating to include optional file_name field for downloading screenshots
2023-06-29 14:04:58 -05:00
its-a-feature 2cd41fb986 v3.0.1-rc30
updating RPCFileCreate to set host field since it wasn't getting set in the database
2023-06-29 13:46:02 -05:00
its-a-feature fd599144ef v3.0.1-rc29
fixed issue with agents reporting back callbacktokens should be removed
2023-06-29 10:08:58 -05:00
its-a-feature 301c772a53 v3.0.1-rc28
updated the way container status is checked to hopefully reduce rabbitmq errors
2023-06-29 08:42:18 -05:00
its-a-feature c427a1f5c2 3.0.1-rc27
forgot to add file to rc26
2023-06-26 15:36:45 -05:00
its-a-feature cd56243581 v3.0.1-rc26
added wrapped_payload_uuid to build message
2023-06-26 15:30:53 -05:00
its-a-feature 58e4536b36 updated ui download links 2023-06-21 16:32:31 -05:00
its-a-feature 1940005b52 updated install flow for agents/c2 profiles 2023-06-20 13:34:53 -05:00
its-a-feature 2e951b158f mythic-cli update 2023-06-20 09:38:54 -05:00
Edznux 7bed629304 Refactor step 2 (refreshJWT + extract SQL) 2023-06-17 11:57:25 +02:00
Edznux 2807e322fb Add more tests 2023-06-17 10:52:11 +02:00
Edznux 0d14a41351 Refactor: guarded clause; extract errors in pkg var 2023-06-17 01:16:19 +02:00
Edznux 9add701f1a Add authentication tests 2023-06-17 00:52:31 +02:00
its-a-feature 319f3f56ab updating UI to show user, architecture, and session id for processes 2023-06-16 12:13:52 -05:00
its-a-feature 4699c55a70 updated UI browserscript page 2023-06-15 17:43:50 -05:00
its-a-feature 27b3f10c63 fixed tag searching and added new scripting example 2023-06-15 15:15:29 -05:00
its-a-feature 14f02c471c updating mythic_scripting pypi package 2023-06-15 11:06:59 -05:00
its-a-feature fcd25c4ce3 fix small UI bug with MITRE ATT&CK 2023-06-14 15:39:50 -05:00
its-a-feature bd15ad557c v3.0.1-rc25 2023-06-14 12:40:05 -05:00
its-a-feature 2b1ebeafe8 added verbosity level for mythic-cli status 2023-06-14 11:57:27 -05:00
its-a-feature be223d4534 updating mythic-cli status output 2023-06-14 11:22:45 -05:00
its-a-feature 76a9d43ed7 added new env variable 2023-06-14 10:18:21 -05:00
its-a-feature a044e90d80 updating mythic-cli 2023-06-14 10:17:27 -05:00
Cody Thomas 9c64ad6443 Merge pull request #299 from sclow/master
Updating installservice.go to include wrapper documentation
2023-06-14 09:35:40 -05:00
its-a-feature c6ccbd3ff7 updated manual link field to only show active callbacks 2023-06-13 12:52:42 -05:00
its-a-feature c47d0dfde5 fixed a ui bug with the graph view 2023-06-13 12:40:59 -05:00
its-a-feature 2dc0914ac6 v3.0.1-rc24
updating container up/down tracking
2023-06-12 15:38:48 -05:00
its-a-feature c6da795ee0 v3.0.1-rc23
updated grpc translation container send/recv size limits
2023-06-09 16:31:32 -05:00
its-a-feature 94db2025e6 bump v3.0.1-rc22
fixed to reflect back keys at "action" level in mythic messages
2023-06-09 14:50:52 -05:00
its-a-feature 626042cf03 v3.0.1-rc21
updated file delete webhook to not worry about already deleted files
2023-06-08 16:42:02 -05:00
its-a-feature 51611c98ef 3.0.1-rc20
updated rpc calls for creating tasks to report back processing as mythic_rpc instead of command_line
2023-06-08 11:33:51 -05:00
its-a-feature 38e9adab45 updated mythic-cli
mythic_server_bind_localhost_only also applies to the mythic_server_dynamic_ports
2023-06-07 16:12:42 -05:00
its-a-feature 48d5043dc2 fixed parsing error in tasking 2023-06-07 15:47:44 -05:00
its-a-feature 1a738ee1e8 UI tweak for tasking_location when using up/down arrows and no params 2023-06-07 14:41:36 -05:00
its-a-feature 40e479f55d few UI tweaks for toast notifications 2023-06-07 12:06:51 -05:00
its-a-feature 4febe4abd7 v3.0.1-rc19
fixed an issue with file browser, timestamps, and un-deleting files
2023-06-05 16:20:12 -05:00
Simon Clow a5f8654216 Updating installservice.go to include wrapper documentation within the local documenation docker container 2023-06-05 16:17:20 +01:00
its-a-feature 0cfb3e8010 v3.0.1-rc18
fixed an issue with UNC paths in file browser responses
2023-06-02 11:05:22 -05:00
its-a-feature 634d654df4 updating mythic-cli v1.0.17
mythic_jupyter keeps deploy key
2023-06-02 08:55:48 -05:00
its-a-feature 16201fee33 v3.0.1-rc17
fixed a bug with get_delegate_tasks not being respected and rpfwd messages not getting collected for delegate messages
2023-06-01 16:19:40 -05:00
its-a-feature b0571500c4 v3.0.1-rc16
removing UI/Server pieces to list webhooks/loggers since it caused round robin actions
2023-06-01 08:51:28 -05:00
its-a-feature b6cdebb5c2 v3.0.1-rc15
bug fixes, rabbitmq fixes, response log listeners, new alert key
2023-05-31 18:29:03 -05:00
its-a-feature 962a18036e bump UI to v.0.1.5-rc10
fixing issue with file browser across multiple hosts
2023-05-30 08:22:48 -05:00
its-a-feature 359a28f016 fixed issue where some search params not always applied in UI 2023-05-26 16:13:56 -05:00
its-a-feature fc1472e9a4 v3.0.1-rc14 2023-05-26 11:24:57 -05:00
its-a-feature 88fc10d1ef v3.0.1-rc13
adjusted return errors for timeouts with direct rabbitmq messages
2023-05-25 11:37:12 -05:00
its-a-feature 2c38fca30a bump v3.0.1-rc12
deleted payloads don't generate callbacks and attempted fix at rpc timeout issues
2023-05-24 12:17:16 -05:00
Cody Thomas 995b1e3998 Merge pull request #297 from MEhrn00/payload-filename
Propagate Filename field to payload builder
2023-05-24 09:08:48 -05:00
Matt Ehrnschwender 6745497690 Propagate Filename field to payload builder 2023-05-23 20:10:50 -04:00
its-a-feature 81cdb1e152 v3.0.1-rc11
ui fixes, new c2 rpc functions, browserscript updates in the ui
2023-05-23 15:35:56 -05:00
its-a-feature 4bed14acb9 bump 3.0.1-rc10
Added base code for two new C2 RPC functions
2023-05-22 21:26:30 -05:00
its-a-feature 95b0a8653b updating browser script editing page with more features
adding the ability to see output and test scripts with commands on the same page
2023-05-22 08:49:40 -05:00
its-a-feature 819ce29a54 updating README 2023-05-19 14:29:57 -05:00
its-a-feature 1a48141442 Updated UI with a few more sliding bars
also fixed an issue with parameters not getting sent down for the upload button in the file browser
2023-05-19 13:02:36 -05:00
its-a-feature a954efd27a bump 3.0.1-rc09
fixed issue with default value for dictionary types being null
2023-05-18 18:10:00 -05:00
its-a-feature 29239dfa1a added a draggable height adjuster for the main callbacks page 2023-05-18 16:02:54 -05:00
its-a-feature 8a8f1f292c bump v3.0.1-rc08
Fixed a few UI issues with process browser and linked agents
2023-05-18 14:41:10 -05:00
its-a-feature df26c33632 fixing subcommand collision in mythic-cli 2023-05-18 11:04:10 -05:00
its-a-feature ee5548e249 updating the README 2023-05-18 10:38:22 -05:00
its-a-feature 742e3883de fixed an issue in the UI for resolving event log warnings 2023-05-18 08:21:27 -05:00
Edznux d35bfba84f Refactor crypto test to use file 2023-05-18 15:19:14 +02:00
its-a-feature 518e270a2c UI tweaks
updated the event feed page to be paginated
2023-05-17 23:12:05 -05:00
its-a-feature ac419c7323 bump v3.0.1-rc07
fixed issue with missing operation_id with payloads and toast notifications always being info icons
2023-05-17 19:35:07 -05:00
its-a-feature 6a4ae214d5 bump v3.0.0-rc06
scripting updates, cli updates, ui updates, and more
2023-05-17 16:52:34 -05:00
Edznux 69854ee85e Refactor and add test for rsa/crypto generation 2023-05-17 00:47:54 +02:00
Edznux e42020c1be Refactor util_agent_message_actions_staging_rsa.go
This refactor uses common patterns in Go such as (but not limited to):
return early/Guard Clause, unit tests, definition of constants variables
2023-05-17 00:47:32 +02:00
Edznux b8e1631450 Add mythic server binary gitignore 2023-05-17 00:44:57 +02:00
its-a-feature 8760f40dc9 bump 3.0.1-rc05
reduced toast notifications
2023-05-16 11:57:27 -05:00
its-a-feature 746580fe0d fixing a uuid parsing error for 16 byte values 2023-05-15 15:03:21 -05:00
its-a-feature caada94f3d bump to v3.0.1-rc03
fixed some bugs with translation containers hanging due to timeouts
2023-05-12 12:39:11 -05:00
its-a-feature 2ad30b6070 bump 3.0.0-rc02
Fixed a few things in the UI to be greyed out if you can't interact with them, allowed people without operations set to create operations and new users
2023-05-10 22:39:18 -05:00
its-a-feature 8bceda1014 updated mythic-cli
fixed an issue where installing services after mythic_sync would uninstall mythic_sync
2023-05-10 20:52:43 -05:00
its-a-feature 2edaef58e8 updated source values for notifications to collapse like events easier
removed c2 profiles/payload types folders and when an event log has no source, make it the md5 hash of the message contents so it's easier to collapse like messages
2023-05-10 20:02:57 -05:00
its-a-feature dfb8068877 update mythic-cli exit codes
return failed exit code if cloning fails for installing services
2023-05-10 16:31:41 -05:00
Cody Thomas 04a8d0daae Merge pull request #276 from its-a-feature/v3.0.0
V3.0.0
2023-05-10 09:28:38 -05:00
its-a-feature dce4f26756 adding build args for jupyter offline builds 2023-05-10 08:49:16 -05:00
its-a-feature 55d951ba39 added alt descriptions to all badges 2023-05-10 08:33:58 -05:00
its-a-feature ef18040abd v3.0.0
Final commit for base v3.0.0
2023-05-10 08:28:20 -05:00
its-a-feature 866c99aa14 removed old unique port requirement from database 2023-05-09 14:36:41 -05:00
its-a-feature 68142ca4eb bump v3.0.0-rc53
Updated to fix a few issues, use new Dockerimages, and fix an issue with extra command attributes
2023-05-09 10:09:50 -05:00
its-a-feature ec959a8aed Added "File" build parameter type
bump to version 3.0.0-rc52
2023-05-05 20:37:52 -05:00
its-a-feature 95e03346f0 fixed some issues with tag data displaying improperly 2023-05-05 16:39:24 -05:00
its-a-feature 6147a31278 removing amd64 requirement for mythic-cli builds 2023-05-05 12:30:53 -05:00
its-a-feature 4966250166 update version check
update the version check for containers to support patch updates
2023-05-05 11:38:50 -05:00
its-a-feature fbeaa581ac UI updates, mythic-cli updates, Dockerimage updates 2023-05-04 16:55:16 -05:00
its-a-feature 7d604f9794 updating mythic-cli to not return error code 1 in some cases 2023-05-02 16:46:52 -05:00
its-a-feature 26da239dad bump v3.0.0-rc50
new UI features, UI bug fixes, more information surrounding processes
2023-05-02 13:38:41 -05:00
its-a-feature eb3450fb38 UI fixes and CLI updates
added update check for mythic-cli
2023-05-01 09:07:30 -05:00
its-a-feature 2afbe6d022 fix VERSION format 2023-04-28 12:13:23 -05:00
its-a-feature c6790b5516 adding InstalledServices folder
adding InstalledServices folder .keep file
2023-04-27 14:37:00 -05:00
its-a-feature 42e98b1d7c bump v3.0.0rc49
added JSON output for reports and updated RPC calls to allow updating of callback process_name
2023-04-27 11:31:58 -05:00
its-a-feature 04936d39eb bump to v3.0.0rc48
fixed ui and back-end for more alert/custom webhooks
2023-04-25 17:32:46 -05:00
its-a-feature 6d293cbf1b updated mythic-cli and pypi package in jupyter
updated env values for webhooks available to containers
2023-04-25 14:12:46 -05:00
its-a-feature 46f499d5dc v3.0.0rc47 - fixed SendMythicRPCFileCreate issue 2023-04-25 11:13:33 -05:00
its-a-feature a02226d851 bump v3.0.0rc46
removed docker templates and put them in MythicMeta
2023-04-24 19:14:00 -05:00
its-a-feature 36966d17fb fixed issue with sha1/md5 of payloads 2023-04-24 11:53:43 -05:00
its-a-feature 27c10e0b8c adding missing file 2023-04-21 14:29:46 -05:00
its-a-feature e168705f46 bump to v3.0.0rc44
the build process can now return an updated filename based on various build options like exe, dll, zip, etc
2023-04-21 14:25:03 -05:00
its-a-feature 6ad652c1f5 fixed issue with installing mythic_sync 2023-04-20 23:50:18 -05:00
its-a-feature 12519bca4a fixed an issue with grouping in the graph view 2023-04-20 21:55:16 -05:00
its-a-feature 39e6c9770d fix an RSA EKE issue 2023-04-20 21:25:02 -05:00
its-a-feature 4ac085753f bump v3.0.0rc42
added new webhook types and new jupyter examples
2023-04-20 11:35:35 -05:00
its-a-feature 9d50274029 added more error messages 2023-04-19 21:44:22 -05:00
its-a-feature 350de0a354 bump to v3.0.0rc41 2023-04-19 21:11:12 -05:00
its-a-feature 5ceb432111 bump to v3.0.0rc40
added setting default operation webhook url and channel from .env for initial start
2023-04-19 10:45:34 -05:00
its-a-feature 1beadb74a9 bump to v3.0.0rc39
Added operation alert for blocked ip trying to connect
2023-04-18 18:07:22 -05:00
its-a-feature 706e1d88d4 fixed hide/unhide issue in ui callbacks search page 2023-04-14 14:23:14 -05:00
its-a-feature 8a47aa8f20 bump to v3.0.0rc38
fixed bug in UI for file browser download and null files
2023-04-14 11:04:43 -05:00
its-a-feature 92936370d9 fixed bug in UI for wrong host with process browser tasking 2023-04-14 10:42:45 -05:00
its-a-feature 20243e619c bump to v3.0.0rc37
fixed some issues with the file browser
2023-04-14 10:30:17 -05:00
its-a-feature 985861d553 bump to v3.0.0rc36 2023-04-14 08:55:21 -05:00
its-a-feature c8c99a4d6b bump to v3.0.0rc35
fixed some search issues with mythicrpc calls
2023-04-13 17:16:53 -05:00
its-a-feature 651995c758 bump to v3.0.0rc34
fixed an issue with files not getting deleted and fixed some links in the UI on the search pages
2023-04-13 10:18:48 -05:00
its-a-feature f0d7f0f98d updating UI version with lots of tag-based updates 2023-04-11 15:35:18 -05:00
its-a-feature f818a19826 bump v3.0.0rc32
fixed an issue with RabbitMQ Channel IDs
2023-04-10 11:14:28 -05:00
its-a-feature 16755514c5 folder wasn't updated 2023-04-06 15:53:42 -05:00
its-a-feature 7330c69a77 updating UI for new tagging feature 2023-04-06 15:33:39 -05:00
its-a-feature 81f68b8c31 update to add ReactUI and updates to mythic-cli 2023-04-06 12:01:11 -05:00
its-a-feature 68da5f5a9a bumping version for updates to mythic-cli 2023-04-05 15:35:00 -05:00
its-a-feature badbf91210 bump to v3.0.0rc29 2023-04-05 14:32:22 -05:00
its-a-feature 86b41cb516 removed a comma 2023-04-04 21:27:33 -05:00
its-a-feature 640b6dc67f fixing issue with channels in v3.0.0rc29 2023-04-04 18:06:47 -05:00
its-a-feature edd865478b bug fixes and bump to v3.0.0rc28 2023-04-04 15:50:05 -05:00
its-a-feature d6cac8bac3 forgot to include a file with the last update 2023-04-03 21:25:08 -05:00
its-a-feature 87a55241fc bumping version with a few bug fixes 2023-04-03 21:22:18 -05:00
its-a-feature 442fce9660 update to v3.0.0rc26
many bug fixes around RPC calls
2023-04-01 02:15:03 -05:00
its-a-feature 6fbd7d6415 bump to v3.0.0rc25
fixed issue with operation channels not pass down to webhook containers
2023-03-30 16:52:27 -05:00
its-a-feature e5cd7aa176 bump v3.0.0rc24 and ui v0.1.0rc13 2023-03-30 14:23:38 -05:00
its-a-feature fc2264b689 bump to v3.0.0rc23
ui fixes, graphql updates, and nginx updates for block lists
2023-03-28 11:59:42 -05:00
its-a-feature f8475f1f45 bump to v3.0.0rc22
added a few fixes for upcoming scripting updates to make things easier for operators
2023-03-25 12:15:49 -05:00
its-a-feature a3d764fbc9 bump to v3.0.0rc21
fixed a token issue with get_tasking
2023-03-23 18:25:44 -05:00
its-a-feature 6884fbebbd whoops
forgot to add a file
2023-03-23 17:56:30 -05:00
its-a-feature f3d9c8ff60 bump to v3.0.0rc20
fixed an issue with tokens in the UI and through to the payload containers
2023-03-23 17:34:10 -05:00
its-a-feature 6298118e22 bump to v3.0.0rc19
bug fixes and partial rework for better scripting capabilities
2023-03-23 16:52:38 -05:00
its-a-feature a54f6073d3 bump to v3.0.0rc18 2023-03-23 09:05:53 -05:00
its-a-feature b25f177705 updating .gitignore for jupyter checkpoints 2023-03-22 13:35:12 -05:00
its-a-feature 24f1aab3e5 bump to v3.0.0rc17 2023-03-22 13:17:33 -05:00
its-a-feature 4a209d48a6 bumping to v3.0.0rc16
fixed an issue on the payloads page with missing hasura permissions
2023-03-21 13:38:53 -05:00
its-a-feature f0b9397362 updating to v3.0.0rc15
fixed an issue with updating user passwords and made payloads in the UI paginated
2023-03-20 16:46:30 -05:00
its-a-feature fcff211b36 bumping to v3.0.0rc14
fixed an issue with the callback add command RPC call
2023-03-19 11:22:47 -05:00
its-a-feature 2240bbdf12 updating to v3.0.0rc13
fixed issues with P2P links and ui connections
2023-03-17 16:02:44 -07:00
its-a-feature 0c0ced03c0 updated gitignore
ignore UUID-based filenames and svg agent icons
2023-03-15 10:56:48 -07:00
its-a-feature 91ca9b9364 updating the base docker image to v0.0.2 2023-03-15 10:55:08 -07:00
its-a-feature 3995eabad6 bump to v3.0.0rc12
fixed an issue with wrong outer UUID passed back too early to the agent
2023-03-15 10:27:11 -07:00
its-a-feature 2ebdc6db3a fixing double status updates 2023-03-15 08:11:15 -07:00
its-a-feature db31503793 updating to v3.0.0rc11 2023-03-14 23:19:00 -07:00
its-a-feature bf541334f4 updating to v3.0.0rc10 2023-03-14 20:57:07 -07:00
its-a-feature c89af2b6f6 update to version v3.0.0rc9
fixed a bug with rsa-based EKE
2023-03-14 20:09:11 -07:00
its-a-feature a966330256 updating to version v3.0.0rc8
fixed an issue with script_only commands and error handling with create_tasking
2023-03-14 12:47:00 -07:00
its-a-feature 838e7f2c9c version v3.0.0rc7
fixed a few bugs with process_response, completion handlers, and new callback UUIDs
2023-03-13 14:34:43 -05:00
its-a-feature 84ce131f39 attempt2 at v3.0.0rc6 fix 2023-03-13 08:56:44 -05:00
its-a-feature ced97e30ae bump to v3.0.0rc6
fixed issue with "none" crypto type selected
2023-03-12 10:15:02 -05:00
its-a-feature ed7c2812ff updated version 0.1.2
bringing .BoolVar -> .BoolVarP update to other functions
2023-03-10 10:46:19 -06:00
Cody Thomas e4f2b375e8 Merge pull request #269 from MEhrn00/v3.0.0-cmdline-flags
Fix shorthand notation for the '-f' flag when installing components through the mythic-cli
2023-03-10 10:43:03 -06:00
Matt Ehrnschwender 7f0a76aff3 Fix shorthand for the '-f' flag when installing components 2023-03-10 11:25:13 -05:00
its-a-feature 20fdc72f49 updating to v3.0.0rc5 2023-03-09 21:32:48 -06:00
its-a-feature d817ee771e Updating mythic-cli to version 0.1.1
Including version addition to docker-compose from @mmmmcoffee, but applied to more places where the config is edited
2023-03-08 20:22:08 -06:00
Cody Thomas fd30e79e36 Merge pull request #268 from mmmmcoffee/patch-2
fix index out of range error on agent/c2 install
2023-03-08 20:06:52 -06:00
mmmmcoffee 52ebca6170 fix index out of range error on agent/c2 install
If the (non-required) branch was not specified when installing from GitHub, the args[1] value would not exist, throwing an exception. Maybe there is a better way to check argument values (or just set a default of "") with the cobra cli library.
2023-03-08 15:49:23 -05:00
its-a-feature 01675731ff updated to v3.0.0rc4 2023-03-07 16:51:03 -06:00
its-a-feature 9f9028f0ed updated processes start_time to also be int64 2023-03-07 10:25:41 -06:00
its-a-feature c6006ec2d1 fixed a small ui issue 2023-03-07 09:11:30 -06:00
its-a-feature 8902a61c1b bumped the version for rc3 2023-03-06 18:07:25 -06:00
its-a-feature ea9c96c27f fixed an issue with "none" for encryption
also fixed a UI bug and updated the version there
2023-03-06 17:55:14 -06:00
its-a-feature 3524b73b3b getting the "files" folder back 2023-03-06 14:39:35 -06:00
its-a-feature 2428731366 updated .gitignore to not ignore some initializer files 2023-03-06 14:07:26 -06:00
its-a-feature eca95c4e24 added in tracking for mitre att&ck commands again 2023-03-06 10:32:01 -06:00
its-a-feature 18a7f91a74 v3.0.0-rc2
fixed a server binding issue and updated some defaults
2023-03-05 22:59:42 -06:00
its-a-feature 0c81840e3c fixed the outdated database schema 2023-03-05 22:35:55 -06:00
its-a-feature 6b208f50dd updated default env to rebuild for now 2023-03-05 22:16:15 -06:00
its-a-feature 5599b431a4 update default mythic_server command and fixed install scripts 2023-03-05 21:57:44 -06:00
its-a-feature 30993ee31f updated cli to not included additional data-dirs for postgres on start 2023-03-05 21:42:41 -06:00
its-a-feature dda590cd6b updated to fix mythic cli to restart always for docker containers 2023-03-05 21:09:59 -06:00
its-a-feature 50086924f2 initial commit of the new Mythic 3.0.0 server 2023-03-03 22:04:56 -06:00
its-a-feature 172992f83a fixed a bug where debugging process_response fields would try to access process_container instead of process_response in the agent's response json 2023-01-31 06:32:28 -08:00
its-a-feature a0ef6428a1 fixed a bug where re-adding deleted c2/build parameters of the same name wouldn't clear the deleted flag and wouldn't be visible in the UI 2022-12-20 14:59:16 -08:00
its-a-feature 832a9ef526 updating to version 0.0.74 with features for tabs 2022-11-07 15:12:29 -08:00
its-a-feature fcac4d9dac updating mythic-cli to version 0.0.8 2022-11-07 07:39:29 -08:00
its-a-feature 5265572a10 updated the mythic-cli to support a fallback from docker-compose to docker compose 2022-11-07 06:53:20 -08:00
its-a-feature b42466d3d1 fixed typo on README 2022-11-04 09:07:17 -07:00
its-a-feature 96f40f72a6 updating hugo documentation container to have side bar expanded by default 2022-10-27 19:04:52 -07:00
its-a-feature ed8b0a0542 updated UI to 0.0.73 to fix an issue with cli parsing and add in additional tracking for callbacks with files 2022-10-25 17:51:54 -07:00
its-a-feature 1259736abf updated how arrays are parsed in the new ui 2022-10-23 13:59:07 -07:00
its-a-feature 51f674f27c fixed issue with byassing opsec pre checks 2022-10-20 14:22:36 -07:00
its-a-feature 300a02e044 removed an error with opsec clearing 2022-10-20 14:01:25 -07:00
its-a-feature e3c78a04b8 removed an error with opsec clearing 2022-10-20 14:00:14 -07:00
its-a-feature 1c354135cf updated rabbitmq to handle some errors better 2022-10-18 14:43:56 -07:00
its-a-feature fa30288ad7 updated the UI to handle command_name manual changes from within tasking 2022-10-18 10:02:24 -07:00
its-a-feature d087969804 small update to make 'success' and 'completed' status codes both show as green 2022-10-18 07:46:15 -07:00
its-a-feature b903892d49 adding additional case to set status to completed for UI 2022-10-17 13:28:02 -07:00
its-a-feature 1a1e4f8a54 updated the UI to verison 0.0.70 to update socks table information, artifact table info, and address a bug with cli parsing in the ui that would get rid of nested quotes in some situations 2022-10-17 11:28:21 -07:00
its-a-feature 0e17f3cfae fixed a gui issue with new tags showing up for tasking 2022-09-20 14:09:11 -07:00
its-a-feature d8e3d2f2eb updated to allow nesting of wrapper payload types 2022-08-31 07:08:29 -07:00
its-a-feature 2c1e1eabd1 updated some of the visibility icons when searching to be clearer 2022-08-29 14:05:45 -07:00
its-a-feature f55da38575 updated UI to show tags on tasks 2022-08-26 14:34:06 -07:00
its-a-feature fc9370007b updated the UI to show keylogging data in a better way 2022-08-26 12:37:56 -07:00
its-a-feature 5c9e288a24 added a Changelog, updated the version, and modified P2P structs to remove the word 2022-08-25 17:18:46 -07:00
its-a-feature c98402a038 updated a few things about callback_tokens and token management in the UI 2022-08-22 08:23:59 -07:00
its-a-feature 48a6b23d3f updated the callback delete code to be more performant 2022-08-16 12:11:04 -07:00
its-a-feature 47efbfa328 updated process browser to support a 'host' field for remote process listings 2022-08-15 08:13:37 -07:00
its-a-feature a7275d2874 updating a few UI features to be a bit easier and more intuitive 2022-08-11 22:10:43 -07:00
its-a-feature 4e1dd0ee31 updated mythic-cli to include hasura experimental feature support 2022-08-11 19:58:28 -07:00
its-a-feature c5300920c9 updated to add functionality via api for deleting tasking/callbacks 2022-08-11 19:37:52 -07:00
its-a-feature c70a845737 fixed a typo querying the wrong data model 2022-08-01 17:46:59 -07:00
its-a-feature e2253f7095 added a quick RPC method for fetching callback information based on UUID 2022-08-01 17:06:20 -07:00
its-a-feature 4fa148122f updated display for non-printable characters 2022-07-24 08:00:56 -07:00
its-a-feature faa5de3f92 fixed array bug in new UI and fixed check in rabbitmq length 2022-07-23 07:20:11 -07:00
its-a-feature 1a92d3e62b adjusted get_file_for_wrapper rpc call to have a get_contents flag in case the file size is too big 2022-07-18 12:18:42 -07:00
its-a-feature ee77f23df3 updated mythicRPC to add new get_file_for_wrapper functionality to get contents/info about a single file when building payloads without needing a task_id or callback_id 2022-07-18 10:56:01 -07:00
its-a-feature cecd3ddfc9 updating the example translator and example payload type folders 2022-07-12 11:38:53 -07:00
its-a-feature 2d3c060297 quick patch in how send_all_operations_message works to avoid some overhead 2022-07-11 15:38:40 -07:00
its-a-feature a11f44b888 adding the postgres configuration file 2022-07-11 14:31:26 -07:00
its-a-feature e845cd9470 added configuration to allow new databases the ability to track queries and get stats 2022-07-11 14:30:43 -07:00
its-a-feature a12e134798 updating to UI version 0.0.59 to fix blocked typing in reverse tasking search 2022-07-08 13:11:42 -07:00
its-a-feature 8ee86eccb7 updating UI to version 0.0.58 to fix reverse search refreshing the page on Linux 2022-07-08 12:32:29 -07:00
its-a-feature bbc04025da fixed a bug where people with blocked commands couldn't run help 2022-07-08 08:33:12 -07:00
its-a-feature 1a7697caac updated icons to be smaller for array tasking, updated tasking and input text boxes to be multi-line with 5-15 lines visible before wrapping. This should help with longer text inputs 2022-06-28 14:53:06 -07:00
Cody Thomas 50ba9f23c9 Merge pull request #236 from ulricvbs/master
Update Example_C2_Profile Base Image
2022-06-23 06:44:20 -07:00
ulricvbs 7cf024440d Add use_ssl to config.json 2022-06-15 13:55:06 -07:00
ulricvbs 33dc6f50af Update server
Add documentation.
2022-06-15 10:57:36 -07:00
ulricvbs 1b9541fac7 Update HTTP.py
Added top-level comments to describe purpose of this file.
2022-06-15 10:18:02 -07:00
ulricvbs 8cb7fb2eea Update C2_RPC_functions.py
Add example implementations for C2 RPC functions with documentation.
2022-06-15 10:02:07 -07:00
ulricvbs 23b179b050 Update Example_C2_Profile Dockerfile base image 2022-06-14 08:13:12 -07:00
ulricvbs 70c4ed2d83 Update C2_RPC_functions.py
Move to mythic_c2_container.MythicRPC import from mythic_c2_container.C2ProfileBase
2022-06-14 08:10:47 -07:00
Cody Thomas ad8e566e09 Merge pull request #235 from its-a-feature/v2.3-testing
attempt to fix upsidedown popups with notistack in new UI
2022-06-08 13:42:51 -07:00
its-a-feature 9b3d89ad40 attempt to fix upsidedown popups with notistack in new UI 2022-06-08 13:42:31 -07:00
Cody Thomas b3fb48fb38 Merge pull request #234 from its-a-feature/v2.3-testing
updating the Example_Payload_Type folder to use an updated apfell age…
2022-06-02 07:06:30 -07:00
its-a-feature 5fbfbc5934 updating the Example_Payload_Type folder to use an updated apfell agent rather than an old atlas agent 2022-06-02 07:06:09 -07:00
Cody Thomas 22a6acc7bc Merge pull request #233 from its-a-feature/v2.3-testing
quick update to add in crypto info for automatic callback generation
2022-05-25 12:22:53 -07:00
its-a-feature 82aec29379 quick update to add in crypto info for automatic callback generation 2022-05-25 12:22:33 -07:00
Cody Thomas bf47dfdf69 Merge pull request #231 from its-a-feature/v2.3-testing
tweaking the return value for the new rpc function
2022-05-13 17:40:31 -07:00
its-a-feature c9bc17dc79 tweaking the return value for the new rpc function 2022-05-13 17:40:10 -07:00
Cody Thomas efd33e2bff Merge pull request #230 from its-a-feature/v2.3-testing
added a create_callback RPC call to the mythic_server and updated the…
2022-05-13 17:37:37 -07:00
its-a-feature 6ed5b7c5fd added a create_callback RPC call to the mythic_server and updated the UI to remember callback table column preferences 2022-05-13 17:37:15 -07:00
Cody Thomas e04ec05f9c Merge pull request #229 from its-a-feature/v2.3-testing
potential fixes for database connection issues by having the connecti…
2022-05-09 14:15:35 -07:00
its-a-feature b1aa905b7b potential fixes for database connection issues by having the connections close and re-open with various checks 2022-05-09 14:15:06 -07:00
Cody Thomas 155991cf00 Merge pull request #228 from its-a-feature/v2.3-testing
Updated the new UI with some better error messages and prevents users…
2022-05-09 06:50:33 -07:00
its-a-feature e65565904e Updated the new UI with some better error messages and prevents users from trying to create payloads without an operation currently set 2022-05-09 06:50:05 -07:00
Cody Thomas b3b7eda353 Merge pull request #226 from its-a-feature/v2.3-testing
updating mythic UI to not double report scripted only commands in cal…
2022-05-02 08:07:12 -07:00
its-a-feature 542540f68e updating mythic UI to not double report scripted only commands in callback metadata 2022-05-02 08:06:47 -07:00
Cody Thomas 38258c8748 Merge pull request #224 from its-a-feature/v2.3-testing
updating ui version to 0.0.53 to allow json,csv,tsv output options fo…
2022-04-29 10:22:00 -07:00
its-a-feature 44d808ec1a updating ui version to 0.0.53 to allow json,csv,tsv output options for response tables in copying 2022-04-29 10:21:33 -07:00
Cody Thomas a2112ffc6c Merge pull request #223 from its-a-feature/v2.3-testing
fixed a hasura permissions error for operators to view the file browser
2022-04-29 09:29:14 -07:00
its-a-feature d7cc0d081f fixed a hasura permissions error for operators to view the file browser 2022-04-29 09:28:32 -07:00
Cody Thomas d51656a937 Merge pull request #221 from its-a-feature/v2.3-testing
updating new ui to support android icons and include a 'copy row to c…
2022-04-27 21:52:37 -07:00
its-a-feature 8d8a0e8d21 updating new ui to support android icons and include a 'copy row to clipboard' feature for task response tables 2022-04-27 21:52:09 -07:00
Cody Thomas 651376c19e Create FUNDING.yml 2022-04-19 16:58:44 -07:00
Cody Thomas fe5ca135cb Merge pull request #216 from its-a-feature/v2.3-testing
updating to allow scripted operation changes to more easily be reflec…
2022-04-18 12:00:08 -07:00
its-a-feature 241f759fdc updating to allow scripted operation changes to more easily be reflected in the UI 2022-04-18 11:59:40 -07:00
Cody Thomas a7129a3b80 Merge pull request #215 from its-a-feature/v2.3-testing
updated a few errors in the UI to be more transparent or hidden
2022-04-14 14:31:09 -07:00
its-a-feature dbc1c86a06 updated a few errors in the UI to be more transparent or hidden 2022-04-14 14:30:31 -07:00
Cody Thomas d93e84a949 Merge pull request #214 from its-a-feature/v2.3-testing
fixed an issue where new operators weren't getting assigned browsersc…
2022-04-14 12:52:07 -07:00
its-a-feature cad1087144 fixed an issue where new operators weren't getting assigned browserscripts for the new UI 2022-04-14 12:51:42 -07:00
Cody Thomas a4d63a8c0d Merge pull request #213 from its-a-feature/v2.3-testing
fixed an issue with double \ characters having one get ignored
2022-04-13 06:52:28 -07:00
its-a-feature d4c5f8be4b fixed an issue with double \ characters having one get ignored 2022-04-13 06:51:56 -07:00
Cody Thomas 7ae42bb9a3 Merge pull request #211 from its-a-feature/v2.3-testing
fixed a bug with filtering on build attributes when creating payloads
2022-04-12 08:37:18 -07:00
its-a-feature bd96b8897a fixed a bug with filtering on build attributes when creating payloads 2022-04-12 08:36:44 -07:00
Cody Thomas 763c77235e Merge pull request #210 from its-a-feature/v2.3-testing
adding search by command name
2022-04-11 07:15:45 -07:00
its-a-feature d11227d875 adding search by command name 2022-04-11 07:14:09 -07:00
Cody Thomas 680e6a8db1 Merge pull request #209 from its-a-feature/v2.3-testing
updating to UI version 0.0.46 with ability to hide operator usernames…
2022-04-11 06:43:27 -07:00
its-a-feature 21fe0e34fb updating to UI version 0.0.46 with ability to hide operator usernames from tasking 2022-04-11 06:43:02 -07:00
Cody Thomas 671ee49910 Merge pull request #208 from its-a-feature/v2.3-testing
V2.3 testing
2022-04-07 14:01:12 -07:00
its-a-feature 3e18441b11 updating the cli processing logic 2022-04-07 14:00:01 -07:00
its-a-feature 76a3d31ec7 updated to make sure deleted accounts can't log in 2022-04-07 13:39:23 -07:00
its-a-feature a56223078e updating CLI parsing to not use yargs-parser 2022-03-31 20:37:10 -07:00
Cody Thomas 84ef2df305 Merge pull request #201 from its-a-feature/v2.3-testing
updating ui to version 0.0.44 to fix bug in credential-json not auto …
2022-03-25 10:48:55 -07:00
its-a-feature 69b329004a updating ui to version 0.0.44 to fix bug in credential-json not auto updating with the first value 2022-03-25 10:47:29 -07:00
Cody Thomas c65b8332ab Merge pull request #199 from its-a-feature/v2.3-testing
updated to ui version 0.0.44 to fix an issue with the expanded callba…
2022-03-23 18:04:02 -07:00
its-a-feature cb4e2f9bbb updated to ui version 0.0.44 to fix an issue with the expanded callback view not passing along the operation_id 2022-03-23 18:03:40 -07:00
Cody Thomas f795ac3f91 Merge pull request #198 from its-a-feature/v2.3-testing
updating new ui to 0.0.42 with browserscripts respecting getConfirmat…
2022-03-23 09:56:37 -07:00
its-a-feature d66890474e updating new ui to 0.0.42 with browserscripts respecting getConfirmation, openDialog, and acceptText 2022-03-23 09:55:28 -07:00
Cody Thomas d46b322f67 Merge pull request #196 from its-a-feature/v2.3-testing
added JWT expiration dialog, explicit close buttons on toast messages
2022-03-21 17:40:52 -07:00
its-a-feature 7734fdebeb added JWT expiration dialog, explicit close buttons on toast messages 2022-03-21 17:40:20 -07:00
Cody Thomas 6181e2c271 Merge pull request #195 from its-a-feature/v2.3-testing
updating the ui to version 0.0.40 to fix a bug with mitre-attack navi…
2022-03-18 16:09:40 -07:00
its-a-feature d2e2758106 updating the ui to version 0.0.40 to fix a bug with mitre-attack navigator export and adding credentials with tasking 2022-03-18 16:09:19 -07:00
Cody Thomas bb08030399 Merge pull request #193 from its-a-feature/v2.3-testing
few minor fixes
2022-03-17 09:12:56 -07:00
its-a-feature 89275e1275 few minor fixes 2022-03-17 08:18:21 -07:00
Cody Thomas d3e035ea3b Merge pull request #192 from its-a-feature/v2.3-testing
fixing a websocket routing issue for scripting
2022-03-15 16:40:39 -07:00
its-a-feature 555d4dc7ec fixing a websocket routing issue for scripting 2022-03-15 16:40:18 -07:00
Cody Thomas 0fb996f5da Merge pull request #191 from its-a-feature/v2.3-testing
updated values to strip after casting to string and updated logic fo…
2022-03-15 15:28:24 -07:00
its-a-feature 0af3c8df9f updated values to strip after casting to string and updated loging for including commands 2022-03-15 15:27:52 -07:00
Cody Thomas c34bd1551e Merge pull request #189 from its-a-feature/v2.3-testing
updated file processing to account for null file_ids instead of empty…
2022-03-13 10:56:45 -07:00
its-a-feature 8f0122edbf updated file processing to account for null file_ids instead of empty strings 2022-03-13 10:56:06 -07:00
Cody Thomas 566e87e290 Merge pull request #188 from its-a-feature/v2.3-testing
added an extra check for agent development if the uuid doesn't get up…
2022-03-12 11:11:26 -08:00
its-a-feature 744eef1b2a updating new ui with some bug fixes 2022-03-12 11:11:05 -08:00
its-a-feature 6316fe1e4a added an extra check for agent development if the uuid doesn't get updated 2022-03-11 17:23:05 -08:00
Cody Thomas a219a9af38 Merge pull request #182 from its-a-feature/v2.3-testing
updating the new, and backend with new file preview options, fixing a…
2022-03-07 15:21:32 -08:00
its-a-feature 7e10094db1 updating the new, and backend with new file preview options, fixing a few icons and scroll issues in the new ui, and fixing a parsing bug with file transfers for the back-end with the Downloads post_response key 2022-03-07 15:21:08 -08:00
Cody Thomas 6ffa100f34 Merge pull request #181 from its-a-feature/v2.3-testing
updating payload wrapper boolean to process the default value correctly
2022-03-06 01:14:20 -08:00
its-a-feature bf69a7eb57 updating payload wrapper boolean to process the default value correctly 2022-03-06 01:13:57 -08:00
Cody Thomas 39b379f50f Merge pull request #180 from its-a-feature/v2.3-testing
updating new UI to fix boolean values for payload wrappers
2022-03-05 17:35:59 -08:00
its-a-feature e5e6073157 updating new UI to fix boolean values for payload wrappers 2022-03-05 17:35:31 -08:00
Cody Thomas ce8d3fab4e Merge pull request #177 from its-a-feature/v2.3-testing
updating the ui to allow newlines to add rows
2022-02-28 17:07:43 -08:00
its-a-feature 0963c473dd updating the ui to allow newlines to add rows 2022-02-28 17:05:47 -08:00
Cody Thomas c997cb4bb5 Merge pull request #176 from its-a-feature/v2.3-testing
removed some unnecessary debugging info
2022-02-23 16:46:31 -08:00
its-a-feature e006d46ef4 removed some unnecessary debugging info 2022-02-23 16:45:55 -08:00
Cody Thomas 2f89343423 Merge pull request #175 from its-a-feature/v2.3-testing
updated the dropdown in the att&ck page to not cause a full page rere…
2022-02-23 16:23:20 -08:00
its-a-feature a26d548ba7 updated the dropdown in the att&ck page to not cause a full page rerender 2022-02-23 16:22:13 -08:00
Cody Thomas e37a76f0ea Merge pull request #174 from its-a-feature/v2.3-testing
made tasking text selectable, updated a few dialogs to be Ace editors…
2022-02-22 14:46:20 -08:00
its-a-feature 6d466c38cb made tasking text selectable, updated a few dialogs to be Ace editors, and hopefully fixed a weird flipped payload completion dialog 2022-02-22 14:45:55 -08:00
Cody Thomas d0c6f2b052 Merge pull request #173 from its-a-feature/v2.3-testing
updated the new ui for adding payloads to hosts to be a bit clearer
2022-02-19 13:35:00 -08:00
its-a-feature fd8209502c updated the new ui for adding payloads to hosts to be a bit clearer 2022-02-19 13:34:33 -08:00
Cody Thomas 5b7af0bc77 Merge pull request #172 from its-a-feature/v2.3-testing
updated the cli parsing to parse JSON if it sees it, otherwise fall b…
2022-02-18 16:56:07 -08:00
its-a-feature 659113b6de updated the cli parsing to parse JSON if it sees it, otherwise fall back on named parameters 2022-02-18 16:52:59 -08:00
Cody Thomas b63fd15594 Merge pull request #171 from its-a-feature/v2.3-testing
fixing a small color issue with the red for the high integrity callba…
2022-02-16 17:08:40 -08:00
its-a-feature 63e74b7b00 fixing a small color issue with the red for the high integrity callbacks in the callbacks table 2022-02-16 17:07:46 -08:00
Cody Thomas e796e381a2 Merge pull request #170 from its-a-feature/v2.3-testing
updating the UI to not break over bad timestamps in the file browser,…
2022-02-16 09:39:47 -08:00
its-a-feature fbe30deffb updating the UI to not break over bad timestamps in the file browser, also adding handling for windows filetime values 2022-02-16 09:38:17 -08:00
Cody Thomas f7c02eb590 Merge pull request #168 from its-a-feature/v2.3-testing
updated the browser scripts to re-trigger on updated status/completio…
2022-02-15 12:48:23 -08:00
its-a-feature 8ac19b447f updated the browser scripts to re-trigger on updated status/completion and updated command descriptions to only break on words 2022-02-15 12:48:00 -08:00
Cody Thomas df7be8c716 Merge pull request #167 from its-a-feature/v2.3-testing
updating the compiled UI to match the recent pull request
2022-02-14 17:06:31 -08:00
its-a-feature 6b3742abab updating the compiled UI to match the recent pull request from @kylewillmon on the MythicReactUI repo 2022-02-14 17:05:32 -08:00
Cody Thomas 996e31cdfe Merge pull request #166 from its-a-feature/v2.3-testing
adding the encoding back in for utf-8
2022-02-14 16:16:46 -08:00
its-a-feature 68a12c3a8c adding the encoding back in for utf-8 2022-02-14 16:16:23 -08:00
Cody Thomas abdd3d0622 Merge pull request #165 from its-a-feature/v2.3-testing
updated the new ui to properly handle unicode output
2022-02-14 16:01:31 -08:00
its-a-feature 537d43dddf updated the new ui to properly handle unicode output 2022-02-14 16:01:06 -08:00
Cody Thomas 7904add647 Merge pull request #164 from its-a-feature/v2.3-testing
fixed a typo of complted to completed
2022-02-14 14:17:23 -08:00
its-a-feature 1a4a5ca883 fixed a typo of complted to completed 2022-02-14 14:16:55 -08:00
Cody Thomas 4924a11867 Merge pull request #163 from its-a-feature/v2.3-testing
updating the new ui to fix an issue with buffer vs atob in parsing ba…
2022-02-14 14:15:36 -08:00
its-a-feature 510ff3f87b updating the new ui to fix an issue with buffer vs atob in parsing base64 blogs 2022-02-14 14:14:56 -08:00
Cody Thomas 9680f749a5 Merge pull request #162 from its-a-feature/v2.3-testing
updating the processes response to not try to insert a bulk of 0 proc…
2022-02-14 13:41:06 -08:00
its-a-feature 8174b40ec4 updating the processes response to not try to insert a bulk of 0 processes 2022-02-14 13:40:39 -08:00
Cody Thomas 00da5e00f7 Merge pull request #161 from its-a-feature/v2.3-testing
reverting the last_checkin sorting, it was causing open menus to close
2022-02-12 11:57:26 -08:00
its-a-feature 0746629cfb reverting the last_checkin sorting, it was causing open menus to close 2022-02-12 11:56:48 -08:00
Cody Thomas 3390d86175 Merge pull request #160 from its-a-feature/v2.3-testing
V2.3 testing
2022-02-12 11:24:07 -08:00
its-a-feature 04475969ba updated the UI to have sorting for the last checkin time 2022-02-12 11:23:46 -08:00
its-a-feature 50a5b6e2f1 removing some unnecessary info logging 2022-02-11 14:11:25 -08:00
Cody Thomas 8454e364b9 Merge pull request #159 from its-a-feature/v2.3-testing
updating the new UI to mui version 5.0.0 and ui version 0.0.26
2022-02-11 13:38:16 -08:00
its-a-feature 2c35412236 updating the new UI to mui version 5.0.0 and ui version 0.0.26 2022-02-11 13:36:04 -08:00
Cody Thomas 04d5b83488 Merge pull request #158 from its-a-feature/v2.3-testing
updated the new ui to version 0.0.25 to allow specifying of an operat…
2022-02-10 11:51:26 -08:00
its-a-feature a3a0dd9cc8 updated the new ui to version 0.0.25 to allow specifying of an operation name when creating new operations 2022-02-10 11:50:47 -08:00
Cody Thomas 46e7d9f11e Merge pull request #157 from its-a-feature/v2.3-testing
noticed that checkins were returning the process_name when specified
2022-02-09 17:49:29 -08:00
its-a-feature 0628f1960d noticed that checkins were returning the process_name when specified 2022-02-09 17:49:07 -08:00
Cody Thomas e29ec3854c Merge pull request #156 from its-a-feature/v2.3-testing
making the payload dictionary available in the dynamic parameters que…
2022-02-09 13:09:38 -08:00
its-a-feature 41ee3436c6 making the payload dictionary available in the dynamic parameters query as well 2022-02-09 13:08:43 -08:00
Cody Thomas f18eb94da9 Merge pull request #155 from its-a-feature/v2.3-testing
added in create_tasking the task.callback.payload dictionary object t…
2022-02-09 12:23:41 -08:00
its-a-feature 6ee971baea added in create_tasking the task.callback.payload dictionary object to access payload configuration information 2022-02-09 12:23:06 -08:00
Cody Thomas e83f34067a Merge pull request #154 from its-a-feature/v2.3-testing
fixed a bug in the mitre mappings when techniques span multiple tactics
2022-02-08 08:21:48 -08:00
its-a-feature db87b7bd70 fixed a bug in the mitre mappings when techniques span multiple tactics 2022-02-08 08:21:30 -08:00
Cody Thomas 558406a510 Merge pull request #153 from its-a-feature/v2.3-testing
V2.3 testing
2022-02-07 21:04:34 -08:00
its-a-feature bf8b547f3b added a filter by task tag for the MITRE ATT&CK mappings 2022-02-07 21:04:08 -08:00
its-a-feature d62af391c9 adjusted a few things so that clicking tabs doesn't cause the callback table to redraw 2022-02-07 14:00:49 -08:00
Cody Thomas bdb17886c9 Merge pull request #152 from its-a-feature/v2.3-testing
fixed the lock icons for callback detailed status
2022-02-07 09:04:41 -08:00
its-a-feature 8b8992349b fixed the lock icons for callback detailed status 2022-02-07 09:03:44 -08:00
Cody Thomas 7a8a57e855 Merge pull request #151 from its-a-feature/v2.3-testing
fixed a bug in the scripted tables with integers vs strings
2022-02-07 08:52:55 -08:00
its-a-feature 8b69c2309b fixed a bug in the scripted tables with integers vs strings 2022-02-07 08:52:31 -08:00
Cody Thomas 9c30b669c6 Merge pull request #150 from its-a-feature/v2.3-testing
V2.3 testing
2022-02-04 15:04:20 -08:00
its-a-feature aecae74860 updated the new ui to have faster text boxes on the search page and to fix a few issues with the create payloads/wrappers pages 2022-02-04 15:03:58 -08:00
its-a-feature 60c2552f89 updated the status field for the help command to return completed rather than success 2022-02-04 10:05:05 -08:00
Cody Thomas 0ad4aa65c2 Merge pull request #148 from its-a-feature/v2.3-testing
V2.3 testing
2022-02-02 14:09:11 -08:00
its-a-feature 7cbef38c3f fixed a bug with the refactored form of the gather_all_responses scripting endpoint 2022-02-02 14:08:42 -08:00
its-a-feature 6756714304 fixed an issue where sometimes callbacks/time wouldn't have a parent ref defined upon render 2022-02-02 11:28:22 -08:00
Cody Thomas 8d25ad5f12 Merge pull request #147 from its-a-feature/v2.3-testing
fixed an issue where some integers were being checked for spaces when…
2022-02-02 09:44:10 -08:00
its-a-feature ba0697d40b fixed an issue where some integers were being checked for spaces when doing commandline parsing 2022-02-02 09:43:46 -08:00
Cody Thomas 1e31860e5e Merge pull request #146 from its-a-feature/v2.3-testing
More UI bug fixes and updates
2022-02-02 08:23:52 -08:00
its-a-feature d05230b84f updated the ordering of parameters for new credential dialogs, fixed a link to mythic documentation, and updated some standard build messages to ace editors 2022-02-02 08:22:34 -08:00
Cody Thomas 0db19e0e4a Merge pull request #145 from its-a-feature/v2.3-testing
updated virtualized table plaintext output
2022-02-01 14:26:44 -08:00
its-a-feature a404e4d11e updated the virtualized tables to replace newlines with empty strings to prevent overflow for static height rows 2022-02-01 14:25:55 -08:00
Cody Thomas b56ef4df60 Merge pull request #144 from its-a-feature/v2.3-testing
fixed an issue with dictionaries and saved c2 instances
2022-02-01 10:04:45 -08:00
its-a-feature 436d87b410 fixed an issue with dictionaries and saved c2 instances 2022-02-01 10:04:18 -08:00
Cody Thomas 70e474a125 Merge pull request #142 from its-a-feature/v2.3-testing
New Kali Install script from @tjnull
2022-01-31 13:25:51 -08:00
its-a-feature 83507ba9e9 adding a new install script for Kali Linux from @tjnull that just fetches from Kali's modified apt repositories 2022-01-31 13:24:23 -08:00
Cody Thomas 3be506be88 Merge pull request #141 from its-a-feature/v2.3-testing
updated the new ui to not require a re-login when changing your current operation
2022-01-31 12:51:31 -08:00
its-a-feature fe1854d29e updated the new ui to not require a re-login when changing your current operation 2022-01-31 12:50:30 -08:00
Cody Thomas c7a9709975 Merge pull request #139 from its-a-feature/v2.3-testing
Update Mythic to 2.3.7
2022-01-31 08:56:36 -08:00
its-a-feature 6f81e24fd5 made plaintext output from tasks editable, but not saved 2022-01-30 21:39:21 -08:00
its-a-feature 1d1d428e4e updating a few bug fixes in the new ui, adding a hide multiple option, and updating the payloadtype pypi file/docker containers to fix an issue with setting custom task statuses 2022-01-30 16:55:26 -08:00
its-a-feature 40d6d89739 added a hide multiple option and fixed a bug with dynamic queries 2022-01-30 09:33:28 -08:00
its-a-feature 3b6b3f4fca updated the get_commands RPC call to actually limit by the commands parameter 2022-01-29 12:22:27 -08:00
its-a-feature 00b94ec5e1 updated the credentials page to truncate long credentials 2022-01-28 17:15:30 -08:00
its-a-feature 3b91fabcee fixed an issue where adding a credential while tasking wouldn't update other fields 2022-01-28 14:30:39 -08:00
its-a-feature f4437452d9 added functionality for commands to see and adjust their own potential group name 2022-01-28 12:58:22 -08:00
its-a-feature d5db932ff5 made parameter queries non-caching and fixed a few leaking subscriptions 2022-01-28 11:14:04 -08:00
its-a-feature e796b103bb removed all of the \ parsing from the new cli parser 2022-01-27 19:27:58 -08:00
its-a-feature dfd3ff95a5 fixed abug in cli parsing that would delete embedded quotes 2022-01-27 18:51:06 -08:00
its-a-feature 2ba5993a7c updated the browser script for screenshots to take an array of file ids 2022-01-27 16:04:51 -08:00
its-a-feature 45fa643ad8 doing up/down arrow in tasking will ignore delegated tasks 2022-01-27 12:08:25 -08:00
its-a-feature f5e86f21b1 updated the virtualized tables to not have such stark color outlines: 2022-01-26 11:26:31 -08:00
its-a-feature fa29ab4915 fixed a bug with getting confirmation before tasking file removal through the file browser 2022-01-26 10:50:05 -08:00
its-a-feature cc6d77af38 updated tooltips, added the exit dropdwn feature for the callback table, and added backdrops when fetching responses 2022-01-26 10:22:43 -08:00
its-a-feature be37419207 updated the new for better response times when streaming responses, new browserscript options, slightly different colors, and added a check for RPC calls with big sizes for rabbitmq max size 2022-01-25 16:20:12 -08:00
its-a-feature d478af6050 fixed a bug with the process browser process_id values and added a loading scren when fetching dynamic query values for tasking 2022-01-24 12:17:55 -08:00
its-a-feature f3f2753a10 updated process browser to only do popup modals for tasking from process rows, not all tasking 2022-01-22 11:39:56 -08:00
its-a-feature f4a2d34827 added in process_browser ui features and fixed a parsing bug with the new cli parameters 2022-01-22 11:26:20 -08:00
its-a-feature e7177487db fixed a bug where descriptions weren't showing up for commands and when adding new credentials as part of tasking they weren't getting used by default 2022-01-22 09:55:47 -08:00
its-a-feature bc9f9218a5 updating the mythic_server to include latex for reporting and to filter out mismatched os commands when tasking and asking for help 2022-01-21 15:06:14 -08:00
its-a-feature b2bd591b90 updating with new MITRE ATT&CK integration 2022-01-20 11:53:46 -08:00
its-a-feature b381b77577 fixed a typo in the file browser 2022-01-18 14:39:35 -08:00
its-a-feature 26dbcbf679 fixed an issue where a child property was accessed without checking for existence in the file browser 2022-01-18 14:25:34 -08:00
its-a-feature 7217bbaaa1 updated the random generation piece for tracking rows in the new grid tables 2022-01-18 10:06:18 -08:00
its-a-feature 96ed803f1e updated payloads page to make it easier to navigate to creating a wrapper payload 2022-01-18 09:15:23 -08:00
its-a-feature 245dfae8ac updating the react ui to cast browser script responses to strings before passing to the browser script 2022-01-18 07:52:26 -08:00
Cody Thomas 2203915ab3 updated database to allow process architecture to be null 2022-01-16 09:43:19 -08:00
Cody Thomas a6876692e3 updating hasura grapql for the file modifications 2022-01-14 16:14:26 -08:00
Cody Thomas edfef7d615 bumped the docker-compose version, added a version file, and updated the new ui to fix an issue with booleans on tasking, keylogs in the wrong order, and the updated file processing for tasking 2022-01-14 15:47:15 -08:00
Cody Thomas feb1a3fb48 disabled sorting on last checkin temporarily 2022-01-13 14:56:46 -08:00
Cody Thomas 1647de97a7 updated the tables for the file/process browser and main callbacks page to support beter sorting and right click filtering 2022-01-13 14:50:36 -08:00
Cody Thomas 176eec224d in another place 2022-01-11 15:26:02 -08:00
Cody Thomas 505acfe244 updated artifacts from task responses to force add the operation attribute 2022-01-11 15:25:33 -08:00
Cody Thomas 714fadf567 updated the browser scripted tables and file browser tree 2022-01-11 09:43:35 -08:00
Cody Thomas c81269cbc3 explicitly setting some fields to be nullable in the database 2022-01-11 09:26:01 -08:00
Cody Thomas f371a45e9e updated database model to allow null enc_key and dec_key for staging purposes 2022-01-11 09:11:30 -08:00
Cody Thomas e6f0d159d8 added more debugging output for translation staging errors 2022-01-11 09:03:43 -08:00
Cody Thomas 9118bfd915 fixed an issue with non p2p payloads in linking commands showing up, adjusted some tooltip styles, and fixed an issue with the file browser tree scrolling 2022-01-11 08:14:19 -08:00
Cody Thomas 0f9d311d6f updating new UI to handle a few browser script bugs 2022-01-07 16:59:51 -08:00
Cody Thomas 001d135362 updated payload description field 2022-01-07 11:40:34 -08:00
Cody Thomas f8e7b239c1 updated permissions for the repsonse_escape field 2022-01-07 11:37:18 -08:00
Cody Thomas f8ac69c84e updated the example translator code 2022-01-07 11:33:00 -08:00
Cody Thomas 1beab1f06d updated hasura graphql with new fields and adjusted translation container messages / versions 2022-01-07 11:31:13 -08:00
Cody Thomas c5c1292453 updated the ui and provided a new graphql query parameter for searching bytea response fields as well as updated the way the ui responds to moving around the file browser 2022-01-06 16:17:23 -08:00
Cody Thomas 2bdeb65b8c updated new search_payloads feature to require callback id to limit by operation 2022-01-06 09:43:00 -08:00
Cody Thomas 54a4addc87 added in the search_payloads RPC call 2022-01-06 09:08:38 -08:00
Cody Thomas a3aacc41e1 fixed a null character issue with fetching data and started incorporating the new vtree and tables in the browser scripting and file browser 2022-01-03 15:46:57 -08:00
Cody Thomas 6b2fcf7658 added check for payload.file existence and return error message if there's no file metadata 2021-12-30 13:27:13 -08:00
Cody Thomas c59ff963da keeping is_p2p as part of the c2info structure 2021-12-30 13:07:50 -08:00
Cody Thomas ede7731735 updated get_payload information to include c2 information in the same format as the connection information 2021-12-30 12:47:23 -08:00
Cody Thomas 7c8c189ff7 updated the staging_translation piece a little 2021-12-29 08:06:19 -08:00
Cody Thomas 0683eeaec6 updated the token display for callback tokens and fixed an issue with greedy arrays for cli parsing 2021-12-22 17:01:47 -08:00
Cody Thomas f774ad6b9b updated the get_commands api call to not filter out script_only commands 2021-12-22 15:32:32 -08:00
Cody Thomas 82602b971b fixed the tasking_location missing from process_response messages 2021-12-22 09:48:27 -08:00
Cody Thomas f466c2845e updated payloads_api to send all commands to payload container on build, even script_only commands, so that you can use the add_commands_to_payload RPC call to check for and add in required commands if they're not selected 2021-12-22 08:55:10 -08:00
Cody Thomas c96bef8b2f updated mythic-cli with a test function and to properly install translation containers. updated the ui to fix some bugs and add new browserscript features, and fixed a p2p bug 2021-12-21 12:07:32 -08:00
Cody Thomas 637cb30a87 Merge pull request #133 from frankli0324/master
fix #132 missing username key
2021-12-17 18:56:27 -08:00
Cody Thomas a43e70427c Merge pull request #131 from mattreduce/fix-web-log-link
Update `/apfell_logs/download` link
2021-12-17 18:54:26 -08:00
Cody Thomas 1bb52e1ee8 updated the new UI for file hosting, additional browser scripting 2021-12-16 20:22:26 -08:00
Frank 32f6a19e94 fix #132 missing username key 2021-12-16 23:05:05 -05:00
Cody Thomas 81e1baeb5b updated mythic-cli to properly add/remove mythic services if you're using your own systems for development without having to restart twice 2021-12-16 08:25:37 -08:00
Cody Thomas 058dc8ff91 added in new reporting features for the new UI using LaTeX 2021-12-15 17:41:16 -08:00
Matthew Conway 530a1e34d9 Update /apfell_logs/download link
Is now /mythic_logs/download
2021-12-06 11:49:50 -08:00
Cody Thomas e64b287289 updating for mythic 2.3.2 - make sure you use the updated PyPi and container versions from https://docs.mythic-c2.net/v/v2.3/customizing/payload-type-development/container-syncing#current-payloadtype-versions 2021-12-02 18:15:00 -08:00
Cody Thomas 56aab1fca1 updating public-facing nginx docker container version 2021-11-15 22:58:27 -08:00
Cody Thomas 373ef22109 updating back-end to support new payload type command parameter updates 2021-11-15 22:45:13 -08:00
Cody Thomas 1660bff6bb updating nginx docker version 2021-11-15 22:42:47 -08:00
Cody Thomas e36cdcabf4 updated the new ui to support menu style browser script buttons and updated the create_subtask function to take in params_string or params_dict for how you want to specify arguments for subtasks 2021-11-04 14:58:53 -07:00
Cody Thomas 6c5151acf8 fixed a few more ui issues 2021-11-04 12:07:29 -07:00
Cody Thomas b4a5482b10 few new ui tweaks 2021-11-03 14:51:55 -07:00
Cody Thomas d0832937b9 fixed some ui bugs and implemented more functionality. tried to fix an ordering issue with responses and added comments to files in the database, please drop your database when pulling in this update 2021-10-28 17:17:49 -07:00
Cody Thomas 8390dd6a27 updated dropdowns in tasking to not update back to default values on react updates 2021-10-12 11:36:14 -07:00
Cody Thomas c8cab97a51 updated the new ui to fix an issue with multiple default values and updating the search page url as you search various components 2021-10-11 23:49:18 -07:00
Cody Thomas 0f9cb85f1a renamed the build folder properly 2021-10-11 22:08:35 -07:00
Cody Thomas 1a621c9705 fixed some UI bugs 2021-10-11 21:54:31 -07:00
Cody Thomas 168533325c updated the react-ui and allowed a new 'download' key in the post_response field 2021-10-10 18:24:39 -07:00
Cody Thomas d0030792f2 first test update for Mythic 2.3.1. Need mythic_payload_type==0.0.47. Check https://docs.mythic-c2.net/customizing/payload-type-development/container-syncing#current-payloadtype-versions for which version of docker containers are needed 2021-10-07 18:57:09 -07:00
Cody Thomas 50347b5b08 Merge pull request #118 from its-a-feature/2.2-updates
2.2 updates
2021-10-07 17:38:52 -07:00
Cody Thomas f74caf19ed removed new ui link 2021-10-07 17:37:19 -07:00
Cody Thomas 2114c2f09b Fixed an issue with hijackable websockets in Firefox if a user is already logged into Mythic and navigates to a compromised website. Issue discovered by @BillDemirkapi on 10/7/2021 and fixed on 10/7/2021 2021-10-07 17:35:30 -07:00
Cody Thomas 4f10b1b497 Merge pull request #110 from its-a-feature/2.2-updates
updaing a few pieces of the new ui
2021-08-04 14:04:03 -07:00
Cody Thomas 8bc514b8e6 updaing a few pieces of the new ui 2021-08-04 14:03:31 -07:00
Cody Thomas f15ec77604 Merge pull request #107 from its-a-feature/2.2-updates
added in a few more pages for the new ui, updated mythic-cli to inclu…
2021-07-29 22:07:42 -07:00
Cody Thomas 0bac5d6da4 added in a few more pages for the new ui, updated mythic-cli to include output urls, auto resolving of some mythic errors in the UI, and new back-end task to auto check for down containers 2021-07-29 22:06:24 -07:00
Cody Thomas df0ca6663c Merge pull request #105 from its-a-feature/2.2-updates
fixed typo in token creation
2021-07-26 12:29:46 -07:00
Cody Thomas 6f71a4ef3a fixed typo in token creation 2021-07-26 12:29:20 -07:00
Cody Thomas 6b4add994d Merge pull request #104 from its-a-feature/2.2-updates
added ability to re-run configuration checks for payloads and fixed b…
2021-07-26 09:03:21 -07:00
Cody Thomas b635944312 added ability to re-run configuration checks for payloads and fixed bad check in tasking 2021-07-26 09:02:49 -07:00
Cody Thomas 8295063269 Merge pull request #102 from its-a-feature/2.2-updates
added in additional RPC function to get callback's loaded commands an…
2021-07-21 22:36:30 -07:00
Cody Thomas 7c10ee7301 added in additional RPC function to get callback's loaded commands and all possible comands for callback 2021-07-21 22:35:14 -07:00
Cody Thomas 41b3923f0f Merge pull request #101 from its-a-feature/2.2-updates
fixed issue with dynamic_query_function not getting passed through to…
2021-07-21 11:03:34 -07:00
Cody Thomas 29958a2686 fixed issue with dynamic_query_function not getting passed through to the UI 2021-07-21 11:02:54 -07:00
Cody Thomas 55a1250f9d Merge pull request #100 from its-a-feature/2.2-updates
updating mythic-cli
2021-07-20 22:10:51 -07:00
Cody Thomas 835ce96276 updating mythic-cli 2021-07-20 22:09:19 -07:00
Cody Thomas 255820e29c Merge pull request #99 from its-a-feature/2.2-updates
updating to Mythic 2.2.12 with more capabilites for C2 profiles to ch…
2021-07-20 15:47:41 -07:00
Cody Thomas be7dfe5bdd updating to Mythic 2.2.12 with more capabilites for C2 profiles to check configurations, generate redirect rules for operators, and access RPC functionality 2021-07-20 15:25:10 -07:00
Cody Thomas 0e01a1dbd5 Merge pull request #98 from its-a-feature/2.2-updates
fixed issue with scripted dictionaries not providing all keys
2021-07-18 21:35:22 -07:00
Cody Thomas 08d03e9f11 fixed issue with scripted dictionaries not providing all keys 2021-07-18 21:34:47 -07:00
Cody Thomas 1a95df64da Merge pull request #97 from its-a-feature/2.2-updates
2.2 updates
2021-07-17 10:35:16 -07:00
Cody Thomas 67bb8325e8 updaing a lot of new UI features for mythic 2.2.11 2021-07-17 10:33:12 -07:00
Cody Thomas c8fcef9b41 updating mythic-react-docker dockerfile for updated packages 2021-07-12 15:28:22 -07:00
Cody Thomas 8433ff0f00 updating for new ui file browser 2021-07-12 15:27:51 -07:00
Cody Thomas bca686105f Merge pull request #96 from its-a-feature/2.2-updates
updating mythic-cli to include an additional error code when a config…
2021-07-12 13:32:52 -07:00
Cody Thomas 7d7190b66b updating mythic-cli to include an additional error code when a config isn't found and updating some react metadata information 2021-07-12 13:32:09 -07:00
Cody Thomas 9603660642 Merge pull request #93 from its-a-feature/2.2-updates
fixed a bug where the key value wasn't set when saving certain kinds …
2021-07-08 14:38:28 -07:00
Cody Thomas 7e0ae8d4b0 fixed a bug where the key value wasn't set when saving certain kinds of dictionary elements for creating c2 profile instances 2021-07-08 14:37:52 -07:00
Cody Thomas 3991ae613f Merge pull request #89 from its-a-feature/2.2-updates
fixed a bug where an empty string was being set for scripted output e…
2021-07-06 15:11:21 -07:00
Cody Thomas c3960df22e fixed a bug where an empty string was being set for scripted output even when the command had no scripting associated with it, resulting in a blank output 2021-07-06 15:10:41 -07:00
Cody Thomas 3915d84faf Merge pull request #88 from its-a-feature/2.2-updates
updating to 2.2.9 and bringing some c2 profile information to the ope…
2021-07-06 13:34:25 -07:00
Cody Thomas a6a2ff335b updating to 2.2.9 and bringing some c2 profile information to the operator view to help developers 2021-07-06 13:33:59 -07:00
Cody Thomas 02a5ef3126 Merge pull request #87 from its-a-feature/2.2-updates
updating mythic-cli to remove tmp directory in case it's still there …
2021-07-06 12:37:04 -07:00
Cody Thomas a9e9c70672 updating mythic-cli to remove tmp directory in case it's still there from failed installs 2021-07-06 12:35:55 -07:00
Cody Thomas cc4c84cf23 Merge pull request #85 from its-a-feature/2.2-updates
fixed bad parameter access when values not supplied for payload creation
2021-07-02 14:26:06 -07:00
Cody Thomas 24fd23e97e fixed bad parameter access when values not supplied for payload creation 2021-07-02 14:25:36 -07:00
Cody Thomas 92b67de45a Merge pull request #84 from its-a-feature/2.2-updates
splitting max number of pooled connections per worker by total connec…
2021-06-30 12:05:22 -07:00
Cody Thomas a52355263f splitting max number of pooled connections per worker by total connections for database to help prevent too many dangling connections 2021-06-30 12:04:32 -07:00
Cody Thomas d218e7fcf0 Merge pull request #83 from its-a-feature/2.2-updates
updating mythic to support container versions 8 and 9
2021-06-28 15:44:27 -07:00
Cody Thomas 45c3837a77 updating mythic to support container versions 8 and 9 2021-06-28 15:43:40 -07:00
Cody Thomas 6b91f212da Merge pull request #82 from its-a-feature/2.2-updates
bug fixes, relaxed constraints on file browser data, fixed sorting on…
2021-06-28 09:54:55 -07:00
Cody Thomas 85bb4d9550 bug fixes, relaxed constraints on file browser data, fixed sorting on share task 2021-06-28 09:53:15 -07:00
Cody Thomas e7309438e8 Merge pull request #81 from its-a-feature/2.2-updates
updating mythic-cli with connection testing and uninstall capability
2021-06-27 14:44:33 -07:00
Cody Thomas 8b84aa0b26 updating mythic-cli with connection testing and uninstall capability 2021-06-27 14:33:32 -07:00
Cody Thomas 2030e2724d Merge pull request #78 from its-a-feature/2.2-updates
adding ability to opsec block overall task due to subtasks output
2021-06-22 13:11:08 -07:00
Cody Thomas eb27da6537 adding ability to opsec block overall task due to subtasks output 2021-06-22 13:09:56 -07:00
Cody Thomas 1da23cea41 Merge pull request #76 from its-a-feature/2.2-updates
2.2 updates
2021-06-22 08:14:29 -07:00
Cody Thomas c6b3bc98f5 Merge remote-tracking branch 'origin' into 2.2-updates 2021-06-22 08:06:58 -07:00
Cody Thomas ce72d7ed01 final updates to version 2.2.7 2021-06-22 07:45:56 -07:00
Cody Thomas edd0caf291 adding file removal back to file browser (with confirmation box) and testing additional upload format 2021-06-21 13:53:28 -07:00
Cody Thomas 1fa74257ae added more tables to graphql 2021-06-18 17:55:05 -07:00
Cody Thomas 9dadc25d44 updated mythic-cli to exit on more error cases 2021-06-17 13:47:33 -07:00
Cody Thomas 8c9cf95251 updated model to add all fields to process json output 2021-06-17 12:31:14 -07:00
Cody Thomas 95e57be2fe updating cli binary to exit if ports are in use with exit codes 2021-06-17 08:47:36 -07:00
Cody Thomas e5fd540f25 fixed reference typo 2021-06-16 10:47:24 -07:00
Cody Thomas 98939b2fe0 removed auto-generated payloads from popuping up in payloads modal dropdown lists 2021-06-16 10:39:33 -07:00
Cody Thomas 57cfe96c59 updated task completion callback check to take opsec blocks into account 2021-06-14 11:56:17 -07:00
Cody Thomas 0bc9d3af12 deleted script_only commands no longer show up in the ui 2021-06-14 10:42:41 -07:00
Cody Thomas eae671becd fixed an issue with the dynamic query check in the UI 2021-06-14 09:47:44 -07:00
Cody Thomas 21658b6582 Updating mythic to 2.2.6 to include subtasking, task tags, dynamic queries for command parameters, and more 2021-06-13 15:00:05 -07:00
Cody Thomas f48779535d fixed the search for looking at logs for a container 2021-06-03 10:00:38 -07:00
Cody Thomas 461498582c switched from GET to POST for getting process data to remove some bota oddities 2021-06-02 21:14:00 -07:00
Cody Thomas f398b21ab3 fixed issue with casting ip address to ip rather than leaving as string for log messages 2021-06-02 08:16:59 -07:00
Cody Thomas 8726de7651 fixed wording 2021-06-01 14:57:32 -07:00
Cody Thomas eb91c6f869 updated documentation for RPC endpoints and added some examples 2021-06-01 14:56:00 -07:00
Cody Thomas 08a71761f9 updated some error messages to use the new mythic-cli binary 2021-05-31 09:47:23 -07:00
Cody Thomas a21d8c5d01 updating README to use new mythic-cli format as well 2021-05-26 18:29:33 -07:00
Cody Thomas ed3dc8f778 updating to Mythic 2.2.4 with the new mythic-cli binary and removing all of the support scripts 2021-05-26 18:27:26 -07:00
Cody Thomas 7ca7ebaee4 fixed a bug where clear wasn't recognized as being 'loaded' in callbacks 2021-05-19 11:01:21 -07:00
Cody Thomas 4a6129febf fixed a bug in auto generating new payloads failing to get the filename 2021-05-19 10:13:19 -07:00
Cody Thomas ca5f368b19 fixed bug in closing tabs 2021-05-19 08:25:39 -07:00
Cody Thomas 48b623309f few fixes for the new ui 2021-05-18 22:30:44 -07:00
Cody Thomas 86f4ae365c allowing get_tasking to optionally not get new delegated task messages via explicit get_delegate_tasks = false in get_tasking messages while still showing links via UI 2021-05-17 18:52:20 -07:00
Cody Thomas 77260d7926 updating stop script to remove the mythic_redis container too 2021-05-13 12:26:50 -07:00
Cody Thomas 5576a64d5e give warning to operator when they try to issue command not loaded into current callback 2021-05-11 12:03:17 -07:00
Cody Thomas 91abfa7321 added try/catch around browserscripts to catch and recover from unhandled exceptions 2021-05-11 10:17:10 -07:00
Cody Thomas 6256f2f716 pulled in @lorpim's ATT&CK v9.0 updates into the 2.2 branch as well as master 2021-05-11 08:10:10 -07:00
Cody Thomas e9dff457f0 updated ui to properly flush previous file information for tasking 2021-05-10 18:46:13 -07:00
Cody Thomas 78404e910e fixed a weird bug where you couldn't select elements on the callbacks page 2021-05-07 22:56:40 -07:00
Cody Thomas 7d4238b5ee make the comment/allparameters/opsec message area bigger by default 2021-05-07 22:49:11 -07:00
Cody Thomas fc849cd739 fixed a bug with opsec checks returning too quickly and overlapping TOCTTOU issues with database updates 2021-05-07 22:24:26 -07:00
Cody Thomas 6da46466b6 quick bug fix for os filtering of new callbacks 2021-05-07 16:11:12 -07:00
Cody Thomas f4399e8c8d updated ui to now show/process commands if they don't support the host os version 2021-05-07 15:45:08 -07:00
Cody Thomas f4e52b0b0d updating to 2.2.2 2021-05-07 11:23:50 -07:00
Cody Thomas 66f3c8da68 added a default case for c2 profile starts to use the mythic server port 2021-04-14 11:11:06 -07:00
Cody Thomas 9085d1d3ed added in better error handling and information for importing commands and payload types 2021-04-05 08:58:16 -07:00
Cody Thomas 691178d007 fixed a typo leading to command info in the documentation container 2021-04-02 07:45:44 -07:00
Cody Thomas 8d8f8cc07b adding .gitkeep to ensure Payload_Types folder exists 2021-04-01 07:18:08 -07:00
Cody Thomas 9b86eed43a updated agent responses to allow 'edges' array to be at the same key level as 'action' and 'responses' and optionally provide a 'task_id' key within it to identify the task 2021-03-30 21:32:08 -07:00
Cody Thomas 5c0c12adf6 a few new ui updates 2021-03-30 17:56:36 -07:00
Cody Thomas 56dc695aac reworked the files page in the old UI a bit 2021-03-30 10:55:31 -07:00
Cody Thomas 628cc6a8da stripping tasking of leading/trailing whitespaces 2021-03-29 16:49:15 -07:00
Cody Thomas b5add0f648 updated files page to have an option of showing all files 2021-03-29 15:31:28 -07:00
Cody Thomas b3d8683ca1 updated to have mythic send proper c2 param types to c2 profiles and payload type containers during builds 2021-03-24 23:02:24 -07:00
Cody Thomas 75ba9dc8b5 fixed issue with spacing 2021-03-24 19:24:20 -07:00
Cody Thomas 94a9debb73 forcing all hostnames to uppercase 2021-03-24 16:58:46 -07:00
Cody Thomas e5bd0ed123 switched to file_stream from file type returns to help with large file transfers 2021-03-22 14:50:27 -07:00
Cody Thomas 5a693dd7de Initial push of the 2.2.* beta udpate 2021-03-21 20:07:07 -07:00
1725 changed files with 205246 additions and 133693 deletions

No files matched your search

-2
View File
@@ -1,2 +0,0 @@
COMPOSE_PROJECT_NAME=apfell
POSTGRES_PASSWORD=super_secret_mythic_user_password
+3
View File
@@ -0,0 +1,3 @@
# These are supported funding model platforms
github: [its-a-feature]
+10
View File
@@ -0,0 +1,10 @@
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
schedule:
interval: "weekly"
- package-ecosystem: "gomod"
directory: "/"
schedule:
interval: "weekly"
+573
View File
@@ -0,0 +1,573 @@
# Pulled from Thanatos (https://github.com/MythicAgents/thanatos/blob/rewrite/.github/workflows/image.yml) - MEhrn00
# Name for the Github actions workflow
name: Build and push container images
on:
# Only run workflow when there is a new release published in Github
#release:
# types: [published]
push:
branches:
- 'Mythic3.3'
- 'master'
tags:
- "v*.*.*"
# Variables holding configuration settings
env:
# Container registry the built container image will be pushed to
REGISTRY: ghcr.io
# Set the container image name to the Github repository name. (its-a-feature/Mythic)
MYTHIC_SERVER_IMAGE_NAME: ${{ github.repository }}_server
MYTHIC_CLI_IMAGE_NAME: ${{ github.repository }}_cli
MYTHIC_POSTGRES_IMAGE_NAME: ${{ github.repository }}_postgres
MYTHIC_RABBITMQ_IMAGE_NAME: ${{ github.repository }}_rabbitmq
MYTHIC_DOCUMENTATION_IMAGE_NAME: ${{ github.repository }}_documentation
MYTHIC_JUPYTER_IMAGE_NAME: ${{ github.repository }}_jupyter
MYTHIC_GRAPHQL_IMAGE_NAME: ${{ github.repository }}_graphql
MYTHIC_NGINX_IMAGE_NAME: ${{ github.repository }}_nginx
MYTHIC_REACT_IMAGE_NAME: ${{ github.repository }}_react
# Description label for the package in Github
IMAGE_DESCRIPTION: "test containers for Mythic development. Do not use this version!"
# Source URL for the package in Github. This links the Github repository packages list
# to this container image
IMAGE_SOURCE: ${{ github.server_url }}/${{ github.repository }}
# License for the container image
IMAGE_LICENSE: BSD-3-Clause
# Set the container image version to the Github release tag
VERSION: ${{ github.ref_name }}
# Branch for pushing release changes
RELEASE_BRANCH: master
jobs:
# Builds the base container image and pushes it to the container registry
mythic_server:
runs-on: ubuntu-latest
permissions:
contents: write
packages: write
steps:
- name: Checkout the repository
uses: actions/checkout@v4 # ref: https://github.com/marketplace/actions/checkout
- name: Log in to the container registry
uses: docker/login-action@v3 # ref: https://github.com/marketplace/actions/docker-login
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: 'arm64,arm'
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3
# the following are unique to this job
- name: Lowercase the server container image name
run: echo "MYTHIC_SERVER_IMAGE_NAME=${MYTHIC_SERVER_IMAGE_NAME,,}" >> ${GITHUB_ENV}
- name: Copy version file over
run: cp VERSION mythic-docker/src/VERSION
- name: Build and push the server container image
uses: docker/build-push-action@v5 # ref: https://github.com/marketplace/actions/build-and-push-docker-images
with:
context: mythic-docker
file: mythic-docker/.docker/Dockerfile
tags: |
${{ env.REGISTRY }}/${{ env.MYTHIC_SERVER_IMAGE_NAME }}:${{ env.VERSION }}
${{ env.REGISTRY }}/${{ env.MYTHIC_SERVER_IMAGE_NAME }}:latest
push: ${{ github.ref_type == 'tag' }}
# These container metadata labels allow configuring the package in Github
# packages. The source will link the package to this Github repository
labels: |
org.opencontainers.image.source=${{ env.IMAGE_SOURCE }}
org.opencontainers.image.description=${{ env.IMAGE_DESCRIPTION }}
org.opencontainers.image.licenses=${{ env.IMAGE_LICENSE }}
platforms: linux/amd64,linux/arm64
mythic_postgres:
runs-on: ubuntu-latest
permissions:
contents: write
packages: write
steps:
# Pull in the repository code
- name: Checkout the repository
uses: actions/checkout@v4 # ref: https://github.com/marketplace/actions/checkout
- name: Log in to the container registry
uses: docker/login-action@v3 # ref: https://github.com/marketplace/actions/docker-login
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: 'arm64,arm'
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3
# the following are unique to this job
- name: Lowercase the postgres container image name
run: echo "MYTHIC_POSTGRES_IMAGE_NAME=${MYTHIC_POSTGRES_IMAGE_NAME,,}" >> ${GITHUB_ENV}
- name: Build and push the postgres container image
uses: docker/build-push-action@v5 # ref: https://github.com/marketplace/actions/build-and-push-docker-images
with:
context: postgres-docker
file: postgres-docker/Dockerfile
tags: |
${{ env.REGISTRY }}/${{ env.MYTHIC_POSTGRES_IMAGE_NAME }}:${{ env.VERSION }}
${{ env.REGISTRY }}/${{ env.MYTHIC_POSTGRES_IMAGE_NAME }}:latest
push: ${{ github.ref_type == 'tag' }}
# These container metadata labels allow configuring the package in Github
# packages. The source will link the package to this Github repository
labels: |
org.opencontainers.image.source=${{ env.IMAGE_SOURCE }}
org.opencontainers.image.description=${{ env.IMAGE_DESCRIPTION }}
org.opencontainers.image.licenses=${{ env.IMAGE_LICENSE }}
platforms: linux/amd64,linux/arm64
mythic_rabbitmq:
runs-on: ubuntu-latest
permissions:
contents: write
packages: write
steps:
# Pull in the repository code
- name: Checkout the repository
uses: actions/checkout@v4 # ref: https://github.com/marketplace/actions/checkout
- name: Log in to the container registry
uses: docker/login-action@v3 # ref: https://github.com/marketplace/actions/docker-login
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: 'arm64,arm'
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3
# the following are unique to this job
- name: Lowercase the rabbitmq container image name
run: echo "MYTHIC_RABBITMQ_IMAGE_NAME=${MYTHIC_RABBITMQ_IMAGE_NAME,,}" >> ${GITHUB_ENV}
- name: Build and push the rabbitmq container image
uses: docker/build-push-action@v5 # ref: https://github.com/marketplace/actions/build-and-push-docker-images
with:
context: rabbitmq-docker
file: rabbitmq-docker/Dockerfile
tags: |
${{ env.REGISTRY }}/${{ env.MYTHIC_RABBITMQ_IMAGE_NAME }}:${{ env.VERSION }}
${{ env.REGISTRY }}/${{ env.MYTHIC_RABBITMQ_IMAGE_NAME }}:latest
push: ${{ github.ref_type == 'tag' }}
# These container metadata labels allow configuring the package in Github
# packages. The source will link the package to this Github repository
labels: |
org.opencontainers.image.source=${{ env.IMAGE_SOURCE }}
org.opencontainers.image.description=${{ env.IMAGE_DESCRIPTION }}
org.opencontainers.image.licenses=${{ env.IMAGE_LICENSE }}
platforms: linux/amd64,linux/arm64
mythic_documentation:
runs-on: ubuntu-latest
permissions:
contents: write
packages: write
steps:
# Pull in the repository code
- name: Checkout the repository
uses: actions/checkout@v4 # ref: https://github.com/marketplace/actions/checkout
- name: Log in to the container registry
uses: docker/login-action@v3 # ref: https://github.com/marketplace/actions/docker-login
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: 'arm64,arm'
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3
# the following are unique to this job
- name: Lowercase the documentation container image name
run: echo "MYTHIC_DOCUMENTATION_IMAGE_NAME=${MYTHIC_DOCUMENTATION_IMAGE_NAME,,}" >> ${GITHUB_ENV}
- name: Build and push the documentation container image
uses: docker/build-push-action@v5 # ref: https://github.com/marketplace/actions/build-and-push-docker-images
with:
context: documentation-docker
file: documentation-docker/Dockerfile
tags: |
${{ env.REGISTRY }}/${{ env.MYTHIC_DOCUMENTATION_IMAGE_NAME }}:${{ env.VERSION }}
${{ env.REGISTRY }}/${{ env.MYTHIC_DOCUMENTATION_IMAGE_NAME }}:latest
push: ${{ github.ref_type == 'tag' }}
# These container metadata labels allow configuring the package in Github
# packages. The source will link the package to this Github repository
labels: |
org.opencontainers.image.source=${{ env.IMAGE_SOURCE }}
org.opencontainers.image.description=${{ env.IMAGE_DESCRIPTION }}
org.opencontainers.image.licenses=${{ env.IMAGE_LICENSE }}
platforms: linux/amd64,linux/arm64
mythic_jupyter:
runs-on: ubuntu-latest
permissions:
contents: write
packages: write
steps:
# Pull in the repository code
- name: Checkout the repository
uses: actions/checkout@v4 # ref: https://github.com/marketplace/actions/checkout
- name: Log in to the container registry
uses: docker/login-action@v3 # ref: https://github.com/marketplace/actions/docker-login
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: 'arm64,arm'
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3
# these two are unique
- name: Lowercase the jupyter container image name
run: echo "MYTHIC_JUPYTER_IMAGE_NAME=${MYTHIC_JUPYTER_IMAGE_NAME,,}" >> ${GITHUB_ENV}
- name: Build and push the jupyter container image
uses: docker/build-push-action@v5 # ref: https://github.com/marketplace/actions/build-and-push-docker-images
with:
context: jupyter-docker
file: jupyter-docker/Dockerfile
tags: |
${{ env.REGISTRY }}/${{ env.MYTHIC_JUPYTER_IMAGE_NAME }}:${{ env.VERSION }}
${{ env.REGISTRY }}/${{ env.MYTHIC_JUPYTER_IMAGE_NAME }}:latest
push: ${{ github.ref_type == 'tag' }}
# These container metadata labels allow configuring the package in Github
# packages. The source will link the package to this Github repository
labels: |
org.opencontainers.image.source=${{ env.IMAGE_SOURCE }}
org.opencontainers.image.description=${{ env.IMAGE_DESCRIPTION }}
org.opencontainers.image.licenses=${{ env.IMAGE_LICENSE }}
platforms: linux/amd64,linux/arm64
mythic_graphql:
runs-on: ubuntu-latest
permissions:
contents: write
packages: write
steps:
# Pull in the repository code
- name: Checkout the repository
uses: actions/checkout@v4 # ref: https://github.com/marketplace/actions/checkout
- name: Log in to the container registry
uses: docker/login-action@v3 # ref: https://github.com/marketplace/actions/docker-login
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: 'arm64,arm'
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3
# these two are unique
- name: Lowercase the graphql container image name
run: echo "MYTHIC_GRAPHQL_IMAGE_NAME=${MYTHIC_GRAPHQL_IMAGE_NAME,,}" >> ${GITHUB_ENV}
- name: Build and push the graphql container image
uses: docker/build-push-action@v5 # ref: https://github.com/marketplace/actions/build-and-push-docker-images
with:
context: hasura-docker
file: hasura-docker/Dockerfile
tags: |
${{ env.REGISTRY }}/${{ env.MYTHIC_GRAPHQL_IMAGE_NAME }}:${{ env.VERSION }}
${{ env.REGISTRY }}/${{ env.MYTHIC_GRAPHQL_IMAGE_NAME }}:latest
push: ${{ github.ref_type == 'tag' }}
# These container metadata labels allow configuring the package in Github
# packages. The source will link the package to this Github repository
labels: |
org.opencontainers.image.source=${{ env.IMAGE_SOURCE }}
org.opencontainers.image.description=${{ env.IMAGE_DESCRIPTION }}
org.opencontainers.image.licenses=${{ env.IMAGE_LICENSE }}
platforms: linux/amd64,linux/arm64
mythic_nginx:
runs-on: ubuntu-latest
permissions:
contents: write
packages: write
steps:
# Pull in the repository code
- name: Checkout the repository
uses: actions/checkout@v4 # ref: https://github.com/marketplace/actions/checkout
- name: Log in to the container registry
uses: docker/login-action@v3 # ref: https://github.com/marketplace/actions/docker-login
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: 'arm64,arm'
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3
# these two are unique
- name: Lowercase the nginx container image name
run: echo "MYTHIC_NGINX_IMAGE_NAME=${MYTHIC_NGINX_IMAGE_NAME,,}" >> ${GITHUB_ENV}
- name: Build and push the nginx container image
uses: docker/build-push-action@v5 # ref: https://github.com/marketplace/actions/build-and-push-docker-images
with:
context: nginx-docker
file: nginx-docker/Dockerfile
tags: |
${{ env.REGISTRY }}/${{ env.MYTHIC_NGINX_IMAGE_NAME }}:${{ env.VERSION }}
${{ env.REGISTRY }}/${{ env.MYTHIC_NGINX_IMAGE_NAME }}:latest
push: ${{ github.ref_type == 'tag' }}
# These container metadata labels allow configuring the package in Github
# packages. The source will link the package to this Github repository
labels: |
org.opencontainers.image.source=${{ env.IMAGE_SOURCE }}
org.opencontainers.image.description=${{ env.IMAGE_DESCRIPTION }}
org.opencontainers.image.licenses=${{ env.IMAGE_LICENSE }}
platforms: linux/amd64,linux/arm64
mythic_react:
runs-on: ubuntu-latest
permissions:
contents: write
packages: write
steps:
# Pull in the repository code
- name: Checkout the repository
uses: actions/checkout@v4 # ref: https://github.com/marketplace/actions/checkout
with:
lfs: true
- name: Log in to the container registry
uses: docker/login-action@v3 # ref: https://github.com/marketplace/actions/docker-login
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: 'arm64,arm'
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3
# these two are unique
- name: Lowercase the react container image name
run: echo "MYTHIC_REACT_IMAGE_NAME=${MYTHIC_REACT_IMAGE_NAME,,}" >> ${GITHUB_ENV}
- name: Build and push the react container image
uses: docker/build-push-action@v5 # ref: https://github.com/marketplace/actions/build-and-push-docker-images
with:
context: mythic-react-docker
file: mythic-react-docker/Dockerfile
tags: |
${{ env.REGISTRY }}/${{ env.MYTHIC_REACT_IMAGE_NAME }}:${{ env.VERSION }}
${{ env.REGISTRY }}/${{ env.MYTHIC_REACT_IMAGE_NAME }}:latest
push: ${{ github.ref_type == 'tag' }}
# These container metadata labels allow configuring the package in Github
# packages. The source will link the package to this Github repository
labels: |
org.opencontainers.image.source=${{ env.IMAGE_SOURCE }}
org.opencontainers.image.description=${{ env.IMAGE_DESCRIPTION }}
org.opencontainers.image.licenses=${{ env.IMAGE_LICENSE }}
platforms: linux/amd64,linux/arm64
# update mythic-cli latest after we're sure all the others build properly
mythic_cli:
runs-on: ubuntu-latest
needs:
- mythic_server
- mythic_postgres
- mythic_rabbitmq
- mythic_documentation
- mythic_jupyter
- mythic_graphql
- mythic_nginx
- mythic_react
permissions:
contents: write
packages: write
steps:
# Pull in the repository code
- name: Checkout the repository
uses: actions/checkout@v4 # ref: https://github.com/marketplace/actions/checkout
- name: Log in to the container registry
uses: docker/login-action@v3 # ref: https://github.com/marketplace/actions/docker-login
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: 'arm64,arm'
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v3
# the following are unique to this job
- name: Lowercase the cli container image name
run: echo "MYTHIC_CLI_IMAGE_NAME=${MYTHIC_CLI_IMAGE_NAME,,}" >> ${GITHUB_ENV}
- name: Fix the mythic_docker_latest reference to reference the new release tag
working-directory: Mythic_CLI/src/cmd/config
run: |
sed -i "s|^const MythicDockerLatest =.*$|const MythicDockerLatest = \"${VERSION}\"|" constants.go
- name: Build and push the cli container image
uses: docker/build-push-action@v5 # ref: https://github.com/marketplace/actions/build-and-push-docker-images
with:
context: Mythic_CLI
file: Mythic_CLI/Dockerfile
tags: |
${{ env.REGISTRY }}/${{ env.MYTHIC_CLI_IMAGE_NAME }}:${{ env.VERSION }}
${{ env.REGISTRY }}/${{ env.MYTHIC_CLI_IMAGE_NAME }}:latest
push: ${{ github.ref_type == 'tag' }}
# These container metadata labels allow configuring the package in Github
# packages. The source will link the package to this Github repository
labels: |
org.opencontainers.image.source=${{ env.IMAGE_SOURCE }}
org.opencontainers.image.licenses=${{ env.IMAGE_LICENSE }}
platforms: linux/amd64,linux/arm64
outputs: type=image,name=target,annotation-index.org.opencontainers.image.description=${{ env.IMAGE_DESCRIPTION }}
update_files:
runs-on: ubuntu-latest
needs:
- mythic_server
- mythic_cli
- mythic_postgres
- mythic_rabbitmq
- mythic_documentation
- mythic_jupyter
- mythic_graphql
- mythic_nginx
- mythic_react
permissions:
contents: write
packages: write
steps:
# Pull in the repository code
- name: Checkout the repository
uses: actions/checkout@v4 # ref: https://github.com/marketplace/actions/checkout
# update names to lowercase
- name: Lowercase the server container image name
run: echo "MYTHIC_SERVER_IMAGE_NAME=${MYTHIC_SERVER_IMAGE_NAME,,}" >> ${GITHUB_ENV}
- name: Lowercase the cli container image name
run: echo "MYTHIC_CLI_IMAGE_NAME=${MYTHIC_CLI_IMAGE_NAME,,}" >> ${GITHUB_ENV}
- name: Lowercase the postgres container image name
run: echo "MYTHIC_POSTGRES_IMAGE_NAME=${MYTHIC_POSTGRES_IMAGE_NAME,,}" >> ${GITHUB_ENV}
- name: Lowercase the rabbitmq container image name
run: echo "MYTHIC_RABBITMQ_IMAGE_NAME=${MYTHIC_RABBITMQ_IMAGE_NAME,,}" >> ${GITHUB_ENV}
- name: Lowercase the documentation container image name
run: echo "MYTHIC_DOCUMENTATION_IMAGE_NAME=${MYTHIC_DOCUMENTATION_IMAGE_NAME,,}" >> ${GITHUB_ENV}
- name: Lowercase the jupyter container image name
run: echo "MYTHIC_JUPYTER_IMAGE_NAME=${MYTHIC_JUPYTER_IMAGE_NAME,,}" >> ${GITHUB_ENV}
- name: Lowercase the graphql container image name
run: echo "MYTHIC_GRAPHQL_IMAGE_NAME=${MYTHIC_GRAPHQL_IMAGE_NAME,,}" >> ${GITHUB_ENV}
- name: Lowercase the nginx container image name
run: echo "MYTHIC_NGINX_IMAGE_NAME=${MYTHIC_NGINX_IMAGE_NAME,,}" >> ${GITHUB_ENV}
- name: Lowercase the react container image name
run: echo "MYTHIC_REACT_IMAGE_NAME=${MYTHIC_REACT_IMAGE_NAME,,}" >> ${GITHUB_ENV}
# The Dockerfile which Mythic uses to pull in the base container image needs to be
# updated to reference the newly built container image
- name: Fix the server Dockerfile reference to reference the new release tag
working-directory: mythic-docker
run: |
sed -i "s|^FROM ghcr\.io.*$|FROM ${REGISTRY}/${MYTHIC_SERVER_IMAGE_NAME}:${VERSION}|" Dockerfile
- name: Fix the cli Dockerfile reference to reference the new release tag
working-directory: Mythic_CLI
run: |
sed -i "s|^FROM ghcr\.io.*$|FROM ${REGISTRY}/${MYTHIC_CLI_IMAGE_NAME}:${VERSION}|" Dockerfile
- name: Fix the cli Makefile reference to reference the new release tag
working-directory: Mythic_CLI
run: |
sed -i "s|^BUILDER_IMAGE=ghcr\.io.*$|BUILDER_IMAGE=${REGISTRY}/${MYTHIC_CLI_IMAGE_NAME}:${VERSION}|" Makefile
- name: Fix the mythic_docker_latest reference to reference the new release tag
working-directory: Mythic_CLI/src/cmd/config
run: |
sed -i "s|^const MythicDockerLatest =.*$|const MythicDockerLatest = \"${VERSION}\"|" constants.go
- name: Fix the postgres Dockerfile reference to reference the new release tag
working-directory: postgres-docker
run: |
sed -i "s|^FROM ghcr\.io.*$|FROM ${REGISTRY}/${MYTHIC_POSTGRES_IMAGE_NAME}:${VERSION}|" Dockerfile
- name: Fix the rabbitmq Dockerfile reference to reference the new release tag
working-directory: rabbitmq-docker
run: |
sed -i "s|^FROM ghcr\.io.*$|FROM ${REGISTRY}/${MYTHIC_RABBITMQ_IMAGE_NAME}:${VERSION}|" Dockerfile
- name: Fix the documentation Dockerfile reference to reference the new release tag
working-directory: documentation-docker
run: |
sed -i "s|^FROM ghcr\.io.*$|FROM ${REGISTRY}/${MYTHIC_DOCUMENTATION_IMAGE_NAME}:${VERSION}|" Dockerfile
- name: Fix the jupyter Dockerfile reference to reference the new release tag
working-directory: jupyter-docker
run: |
sed -i "s|^FROM ghcr\.io.*$|FROM ${REGISTRY}/${MYTHIC_JUPYTER_IMAGE_NAME}:${VERSION}|" Dockerfile
- name: Fix the graphql Dockerfile reference to reference the new release tag
working-directory: hasura-docker
run: |
sed -i "s|^FROM ghcr\.io.*$|FROM ${REGISTRY}/${MYTHIC_GRAPHQL_IMAGE_NAME}:${VERSION}|" Dockerfile
- name: Fix the nginx Dockerfile reference to reference the new release tag
working-directory: nginx-docker
run: |
sed -i "s|^FROM ghcr\.io.*$|FROM ${REGISTRY}/${MYTHIC_NGINX_IMAGE_NAME}:${VERSION}|" Dockerfile
- name: Fix the react Dockerfile reference to reference the new release tag
working-directory: mythic-react-docker
run: |
sed -i "s|^FROM ghcr\.io.*$|FROM ${REGISTRY}/${MYTHIC_REACT_IMAGE_NAME}:${VERSION}|" Dockerfile
# Push the changes to the Dockerfile
- name: Push the updated base Dockerfile image reference changes
if: ${{ github.ref_type == 'tag' }}
uses: EndBug/add-and-commit@v9 # ref: https://github.com/marketplace/actions/add-commit
with:
# Only add the Dockerfile changes. Nothing else should have been modified
add: "['Mythic_CLI/Makefile', 'Mythic_CLI/src/cmd/config/constants.go']"
# Use the Github actions bot for the commit author
default_author: github_actions
committer_email: github-actions[bot]@users.noreply.github.com
# Set the commit message
message: "Bump Mythic Dockerfile tag to match release '${{ env.VERSION }}'"
# Overwrite the current git tag with the new changes
tag: '${{ env.VERSION }} --force'
# Push the new changes with the tag overwriting the current one
tag_push: '--force'
# Push the commits to the branch marked as the release branch
push: origin HEAD:${{ env.RELEASE_BRANCH }} --set-upstream
# Have the workflow fail in case there are pathspec issues
pathspec_error_handling: exitImmediately
+35 -5
View File
@@ -3,23 +3,43 @@ __pycache__/
# Sphinx documentation
docs/_build/
# Environments
#.env
.env
tmp
saved_images/
.venv
*.swp
mythic_server
docker-compose.yml
.ipynb_checkpoints/
env/
venv/
ENV/
mythic-cli
.DS_Store
[0-9a-zA-Z]*-[0-9a-zA-Z]*-[0-9a-zA-Z]*-[0-9a-zA-Z]*-[0-9a-zA-Z]*
*.svg
env.bak/
venv.bak/
# pycharm
.idea/
# ssl certs
ssl/
# downloaded files
files/
# Mythic files
nginx-docker/config/blockips.conf
mythic-docker/src/Mythic
mythic_access.*
mythic_sync/
postgres-docker/database/
rabbitmq-docker/storage/
**/transforms.py
C2_profiles/
Payload_Types/
InstalledServices/
Docker_Templates/
documentation-docker/content/
documentation-docker/public/
display_output.txt
full_attack.json
nginx-docker/config/conf.d/services.conf
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
@@ -139,4 +159,14 @@ $tf/
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
*.DotSettings.user
# vscode
.vscode/
jupyter-docker/jupyter/MythicExamples/.ipynb_checkpoints/
nginx-docker/config/blockips.conf
/MythicReactUI/build/
/MythicReactUI/node_modules/
/.gocache/
-1
View File
@@ -1 +0,0 @@
From itsafeaturemythic/python38_sanic_c2profile:0.0.1
-17
View File
@@ -1,17 +0,0 @@
{
"instances": [
{
"ServerHeaders": {
"Server": "NetDNA-cache/2.2",
"Cache-Control": "max-age=0, no-cache",
"Pragma": "no-cache",
"Connection": "keep-alive",
"Content-Type": "application/javascript; charset=utf-8"
},
"port": 80,
"key_path": "",
"cert_path": "",
"debug": false
}
]
}
-10
View File
@@ -1,10 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Page Not Found!</title>
</head>
<body>
</body>
</html>
-125
View File
@@ -1,125 +0,0 @@
#!/usr/bin/env python3
from sanic import Sanic
from sanic.response import html, redirect, text, raw
from sanic.exceptions import NotFound
import sys
import asyncio
import ssl
from pathlib import Path
import requests
import json
import os
config = {}
async def print_flush(message):
print(message)
sys.stdout.flush()
def server_error_handler(request, exception):
if request is None:
print("Invalid HTTP Method - Likely HTTPS trying to talk to HTTP")
sys.stdout.flush()
return html("Error: Failed to process request", status=500, headers={})
return html("Error: Requested URL {} not found".format(request.url), status=404, headers=config[request.app.name]['headers'])
async def agent_message(request, **kwargs):
global config
try:
if config[request.app.name]['debug']:
await print_flush("agent_message request from: {} with {} and {}".format(request.url, request.cookies, request.headers))
await print_flush(" and URI: {}".format(request.query_string))
if config[request.app.name]['debug']:
await print_flush("Forwarding along to: {}".format(config['mythic_address']))
if request.method == "POST":
# manipulate the request if needed
#await MythicCallbackRPC().add_event_message(message="got a POST message")
response = requests.post(config['mythic_address'], data=request.body, verify=False, cookies=request.cookies, headers=request.headers)
else:
# manipulate the request if needed
#await MythicCallbackRPC().add_event_message(message="got a GET message")
#msg = await MythicCallbackRPC().encrypt_bytes(with_uuid=True, data="my message".encode(), uuid="eaf10700-cb30-402d-b101-8e35d67cdb41")
#await MythicCallbackRPC().add_event_message(message=msg.response)
response = requests.get(config['mythic_address'] + "?{}".format(request.query_string), verify=False, data=request.body, cookies=request.cookies, headers=request.headers)
return raw(response.content, headers=config[request.app.name]['headers'], status=response.status_code)
except Exception as e:
if request is None:
await print_flush("Invalid HTTP Method - Likely HTTPS trying to talk to HTTP")
return server_error_handler(request, e)
if config[request.app.name]['debug']:
await print_flush("error in agent_message: {}".format(str(e)))
return server_error_handler(request, e)
if __name__ == "__main__":
sys.path.append("/Mythic/mythic")
from C2ProfileBase import *
from MythicCallbackRPC import *
config_file = open("config.json", 'rb')
main_config = json.loads(config_file.read().decode('utf-8'))
print("Opening config and starting instances...")
sys.stdout.flush()
# basic mapping of the general endpoints to the real endpoints
try:
config['mythic_address'] = os.environ['MYTHIC_ADDRESS']
except Exception as e:
print("failed to find MYTHIC_ADDRESS environment variable")
sys.stdout.flush()
sys.exit(1)
# now look at the specific instances to start
for inst in main_config['instances']:
config[str(inst['port'])] = {'debug': inst['debug'],
'headers': inst['ServerHeaders']}
if inst['debug']:
print("Debugging statements are enabled. This gives more context, but might be a performance hit")
else:
print("Debugging statements are disabled")
sys.stdout.flush()
# now to create an app instance to handle responses
app = Sanic(str(inst['port']))
app.config['REQUEST_MAX_SIZE'] = 1000000000
app.config['REQUEST_TIMEOUT'] = 600
app.config['RESPONSE_TIMEOUT'] = 600
app.add_route(agent_message, "/<uri:path>", methods=['GET','POST'])
app.add_route(agent_message, "/", methods=['GET','POST'])
app.error_handler.add(Exception, server_error_handler)
keyfile = Path(inst['key_path'])
certfile = Path(inst['cert_path'])
if keyfile.is_file() and certfile.is_file():
context = ssl.create_default_context(purpose=ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain(inst['cert_path'], keyfile=inst['key_path'])
if inst['debug']:
server = app.create_server(host="0.0.0.0", port=inst['port'], ssl=context, debug=False, return_asyncio_server=True, access_log=True)
else:
server = app.create_server(host="0.0.0.0", port=inst['port'], ssl=context, debug=False, return_asyncio_server=True, access_log=False)
if inst['debug']:
print("using SSL for port {}".format(inst['port']))
sys.stdout.flush()
else:
if inst['debug']:
print("not using SSL for port {}".format(inst['port']))
sys.stdout.flush()
if inst['debug']:
server = app.create_server(host="0.0.0.0", port=inst['port'], debug=False, return_asyncio_server=True, access_log=True)
else:
server = app.create_server(host="0.0.0.0", port=inst['port'], debug=False, return_asyncio_server=True, access_log=False)
task = asyncio.ensure_future(server)
try:
loop = asyncio.get_event_loop()
def callback(fut):
try:
fetch_count = fut.result()
except:
print("port already in use")
sys.stdout.flush()
sys.exit()
task.add_done_callback(callback)
loop.run_forever()
except:
sys.exit()
loop.stop()
-130
View File
@@ -1,130 +0,0 @@
from enum import Enum
from abc import abstractmethod
import json
class ParameterType(Enum):
String = "String"
ChooseOne = "ChooseOne"
Array = "Array"
Date = "Date"
Dictionary = "Dictionary"
class C2ProfileParameter:
def __init__(
self,
name: str,
description: str,
default_value: str = "",
randomize: bool = False,
format_string: str = "",
parameter_type: ParameterType = ParameterType.String,
required: bool = True,
verifier_regex: str = "",
choices: [str] = None,
):
self.name = name
self.description = description
self.randomize = randomize
self.format_string = format_string
self.parameter_type = parameter_type
self.required = required
self.verifier_regex = verifier_regex
self.choices = choices
self.default_value = ""
if self.parameter_type == ParameterType.ChooseOne and choices is not None:
self.default_value = "\n".join(choices)
else:
self.default_value = default_value
def to_json(self):
return {
"name": self.name,
"description": self.description,
"default_value": self.default_value if self.parameter_type not in [ParameterType.Array, ParameterType.Dictionary] else json.dumps(self.default_value),
"randomize": self.randomize,
"format_string": self.format_string,
"required": self.required,
"parameter_type": self.parameter_type.value,
"verifier_regex": self.verifier_regex,
}
class C2Profile:
@property
@abstractmethod
def name(self):
pass
@property
@abstractmethod
def description(self):
pass
@property
@abstractmethod
def author(self):
pass
@property
@abstractmethod
def is_p2p(self):
pass
@property
@abstractmethod
def is_server_routed(self):
pass
@property
@abstractmethod
def mythic_encrypts(self):
pass
@property
@abstractmethod
def parameters(self):
pass
def to_json(self):
return {
"name": self.name,
"description": self.description,
"author": self.author,
"mythic_encrypts": self.mythic_encrypts,
"is_p2p": self.is_p2p,
"is_server_routed": self.is_server_routed,
"params": [x.to_json() for x in self.parameters],
}
class RPCStatus(Enum):
Success = "success"
Error = "error"
class RPCResponse:
def __init__(self, status: RPCStatus = None, response: str = None):
self.status = status
self.response = response
@property
def status(self):
return self._status
@status.setter
def status(self, status):
self._status = status
@property
def response(self):
return self._response
@response.setter
def response(self, response):
self._response = response
def to_json(self):
return {"status": self.status.value, "response": self.response}
-99
View File
@@ -1,99 +0,0 @@
from aio_pika import connect_robust, IncomingMessage, Message
import asyncio
import uuid
import json
from enum import Enum
class MythicStatus(Enum):
Success = "success"
Error = "error"
class RPCResponse:
def __init__(self, resp: dict):
self._raw_resp = resp
if resp["status"] == "success":
self.status = MythicStatus.Success
self.response = resp["response"] if "response" in resp else ""
self.error_message = None
else:
self.status = MythicStatus.Error
self.error_message = resp["error"]
self.response = None
@property
def status(self):
return self._status
@status.setter
def status(self, status):
self._status = status
@property
def error_message(self):
return self._error_message
@error_message.setter
def error_message(self, error_message):
self._error_message = error_message
@property
def response(self):
return self._response
@response.setter
def response(self, response):
self._response = response
class MythicBaseRPC:
def __init__(self):
self.connection = None
self.channel = None
self.callback_queue = None
self.futures = {}
self.loop = asyncio.get_event_loop()
async def connect(self):
config_file = open("/Mythic/mythic/rabbitmq_config.json", "rb")
main_config = json.loads(config_file.read().decode("utf-8"))
config_file.close()
self.connection = await connect_robust(
host=main_config["host"],
login=main_config["username"],
password=main_config["password"],
virtualhost=main_config["virtual_host"],
)
self.channel = await self.connection.channel()
self.callback_queue = await self.channel.declare_queue(exclusive=True)
await self.callback_queue.consume(self.on_response)
return self
def on_response(self, message: IncomingMessage):
future = self.futures.pop(message.correlation_id)
future.set_result(message.body)
async def call(self, n, receiver: str = None) -> RPCResponse:
if self.connection is None:
await self.connect()
correlation_id = str(uuid.uuid4())
future = self.loop.create_future()
self.futures[correlation_id] = future
if receiver is None:
router = "c2rpc_queue"
else:
router = "{}_rpc_queue".format(receiver)
await self.channel.default_exchange.publish(
Message(
json.dumps(n).encode(),
content_type="application/json",
correlation_id=correlation_id,
reply_to=self.callback_queue.name,
),
routing_key=router,
)
return RPCResponse(json.loads(await future))
@@ -1,124 +0,0 @@
from MythicBaseRPC import *
import base64
class MythicRPCResponse(RPCResponse):
def __init__(self, resp: RPCResponse):
super().__init__(resp._raw_resp)
if resp.status == MythicStatus.Success:
self.data = resp.response
else:
self.data = None
@property
def data(self):
return self._data
@data.setter
def data(self, data):
self._data = data
class MythicCallbackRPC(MythicBaseRPC):
# returns dictionary of `{"raw": raw_tasking, "encrypted": base64(uuid+encrypted_tasking)}`
async def get_tasking(
self, uuid: str, tasking_size: int = 1
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "get_tasking",
"uuid": uuid,
"tasking_size": tasking_size,
}
)
return MythicRPCResponse(resp)
async def add_route(
self,
source_uuid: str,
destination_uuid: str,
direction: int = 1,
metadata: str = None,
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "add_route",
"source": source_uuid,
"destination": destination_uuid,
"direction": direction,
"metadata": metadata,
}
)
return MythicRPCResponse(resp)
async def remove_route(
self,
source_uuid: str,
destination_uuid: str,
direction: int = 1,
metadata: str = None,
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "remove_route",
"source": source_uuid,
"destination": destination_uuid,
"direction": direction,
"metadata": metadata,
}
)
return MythicRPCResponse(resp)
async def get_callback_info(self, uuid: str) -> MythicRPCResponse:
resp = await self.call({"action": "get_callback_info", "uuid": uuid})
return MythicRPCResponse(resp)
async def get_encryption_data(self, uuid: str, profile: str) -> MythicRPCResponse:
resp = await self.call(
{
"action": "get_encryption_data",
"uuid": uuid,
"c2_profile": profile,
}
)
return MythicRPCResponse(resp)
async def update_callback_info(self, uuid: str, info: dict) -> MythicRPCResponse:
resp = await self.call(
{"action": "update_callback_info", "uuid": uuid, "data": info}
)
return MythicRPCResponse(resp)
async def add_event_message(
self, message: str, level: str = "info"
) -> MythicRPCResponse:
resp = await self.call(
{"action": "add_event_message", "level": level, "message": message}
)
return MythicRPCResponse(resp)
async def encrypt_bytes(
self, data: bytes, uuid: str, with_uuid: bool = False,
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "encrypt_bytes",
"data": base64.b64encode(data).decode(),
"uuid": uuid,
"with_uuid": with_uuid,
}
)
return MythicRPCResponse(resp)
async def decrypt_bytes(
self, data: bytes, uuid: str, with_uuid: bool = False,
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "decrypt_bytes",
"uuid": uuid,
"data": base64.b64encode(data).decode(),
"with_uuid": with_uuid,
}
)
return MythicRPCResponse(resp)
@@ -1,11 +0,0 @@
from C2ProfileBase import *
import MythicCallbackRPC
# request is a dictionary: {"action": func_name, "message": "the input", "task_id": task id num}
# must return an RPCResponse() object and set .status to an instance of RPCStatus and response to str of message
async def test(request):
response = RPCResponse()
response.status = RPCStatus.Success
response.response = "hello"
#resp = await MythicCallbackRPC.MythicCallbackRPC().add_event_message(message="got a POST message")
return response
@@ -1,195 +0,0 @@
from C2ProfileBase import *
class HTTP(C2Profile):
name = "HTTP"
description = "Uses HTTP(S) connections with a simple query parameter or basic POST messages. For more configuration options use dynamicHTTP."
author = "@its_a_feature_"
is_p2p = False
is_server_routed = False
mythic_encrypts = True
parameters = [
C2ProfileParameter(
name="callback_port",
description="Callback Port",
default_value="80",
verifier_regex="^[0-9]+$",
required=False,
),
C2ProfileParameter(
name="killdate",
description="Kill Date",
parameter_type=ParameterType.Date,
default_value=365,
required=False,
),
C2ProfileParameter(
name="encrypted_exchange_check",
description="Perform Key Exchange",
choices=["T", "F"],
parameter_type=ParameterType.ChooseOne,
),
C2ProfileParameter(
name="callback_jitter",
description="Callback Jitter in percent",
default_value="23",
verifier_regex="^[0-9]+$",
required=False,
),
C2ProfileParameter(
name="domain_front",
description="Host header value for domain fronting",
default_value="",
required=False,
),
C2ProfileParameter(
name="USER_AGENT",
description="User Agent",
default_value="Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko",
required=False,
),
C2ProfileParameter(
name="AESPSK",
description="Base64 of a 32B AES Key",
default_value="",
required=False,
),
C2ProfileParameter(
name="callback_host",
description="Callback Host",
default_value="https://domain.com",
verifier_regex="^(http|https):\/\/[a-zA-Z0-9]+",
),
C2ProfileParameter(
name="get_uri",
description="GET request URI",
default_value="index",
required=True,
),
C2ProfileParameter(
name="post_uri",
description="POST request URI",
default_value="data",
required=True,
),
C2ProfileParameter(
name="query_path_name",
description="Name of the query parameter",
default_value="q",
required=True,
),
C2ProfileParameter(
name="proxy_host",
description="Proxy Host",
default_value="",
required=False,
verifier_regex="^$|^(http|https):\/\/[a-zA-Z0-9]+",
),
C2ProfileParameter(
name="proxy_port",
description="Proxy Port",
default_value="",
verifier_regex="^$|^[0-9]+$",
required=False,
),
C2ProfileParameter(
name="proxy_user",
description="Proxy Username",
default_value="",
required=False,
),
C2ProfileParameter(
name="proxy_pass",
description="Proxy Password",
default_value="",
required=False,
),
C2ProfileParameter(
name="callback_interval",
description="Callback Interval in seconds",
default_value="10",
verifier_regex="^[0-9]+$",
required=False,
),
]
"""
C2ProfileParameter(
name="callback_port",
description="Callback Port",
default_value="80",
verifier_regex="^[0-9]+$",
required=False,
),
C2ProfileParameter(
name="encrypted_exchange_check",
description="Perform Key Exchange",
choices=["T", "F"],
parameter_type=ParameterType.ChooseOne,
),
C2ProfileParameter(
name="callback_jitter",
description="Callback Jitter in percent",
default_value="23",
verifier_regex="^[0-9]+$",
required=False,
),
C2ProfileParameter(
name="domain_front",
description="Host header value for domain fronting",
default_value="",
required=False,
),
C2ProfileParameter(
name="callback_host",
description="Callback Host",
default_value="https://domain.com",
parameter_type=ParameterType.Array,
verifier_regex="^(http|https):\/\/[a-zA-Z0-9]+",
),
C2ProfileParameter(
name="killdate",
description="Kill Date",
parameter_type=ParameterType.Date,
default_value=365,
required=False,
),
C2ProfileParameter(
name="USER_AGENT",
description="User Agent",
required=False,
parameter_type=ParameterType.Dictionary,
default_value=[
{
"name": "USER_AGENT",
"max": 1,
"default_value": "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko",
"default_show": True,
},
{
"name": "host",
"max": 2,
"default_value": "",
"default_show": False,
},
{
"name": "*",
"max": -1,
"default_value": "",
"default_show": False
}
]
),
C2ProfileParameter(
name="AESPSK",
description="Base64 of a 32B AES Key",
default_value="",
required=False,
),
C2ProfileParameter(
name="callback_interval",
description="Callback Interval in seconds",
default_value="10",
verifier_regex="^[0-9]+$",
required=False,
),"""
-7
View File
@@ -1,7 +0,0 @@
#!/bin/bash
cd /Mythic/mythic
export PYTHONPATH=/Mythic:/Mythic/mythic
python3.8 mythic_service.py
-410
View File
@@ -1,410 +0,0 @@
#!/usr/bin/env python3
import aio_pika
import os
import time
import sys
import subprocess
import _thread
import base64
import json
import socket
import asyncio
import pathlib
import traceback
from C2ProfileBase import *
from importlib import import_module, invalidate_caches
from functools import partial
credentials = None
connection_params = None
running = False
process = None
thread = None
hostname = ""
output = ""
exchange = None
container_files_path = None
def deal_with_stdout():
global process
global output
while True:
try:
for line in iter(process.stdout.readline, b""):
output += line.decode("utf-8")
except Exception as e:
print("Exiting thread due to: {}\n".format(str(e)))
sys.stdout.flush()
break
def import_all_c2_functions():
import glob
# Get file paths of all modules.
modules = glob.glob("c2_functions/*.py")
invalidate_caches()
for x in modules:
if not x.endswith("__init__.py") and x[-3:] == ".py":
module = import_module("c2_functions." + pathlib.Path(x).stem, package=None)
for el in dir(module):
if "__" not in el:
globals()[el] = getattr(module, el)
async def send_status(message="", routing_key=""):
global exchange
try:
message_body = aio_pika.Message(message.encode())
await exchange.publish(message_body, routing_key=routing_key)
except Exception as e:
print("Exception in send_status: {}".format(str(e)))
sys.stdout.flush()
async def callback(message: aio_pika.IncomingMessage):
global running
global process
global output
global thread
global hostname
global container_files_path
with message.process():
# messages of the form: c2.modify.PROFILE NAME.command
try:
command = message.routing_key.split(".")[3]
username = message.routing_key.split(".")[4]
server_path = container_files_path / "server"
# command = body.decode('utf-8')
if command == "start":
if not running:
# make sure to start the /Apfell/server in the background
os.chmod(server_path, mode=0o777)
output = ""
process = subprocess.Popen(
str(server_path),
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
cwd=str(container_files_path),
)
thread = _thread.start_new_thread(deal_with_stdout, ())
time.sleep(3)
process.poll()
if process.returncode is not None:
# this means something went wrong and the process is dead
running = False
await send_status(
message="Failed to start\nOutput: {}".format(output),
routing_key="c2.status.{}.stopped.start.{}".format(
hostname, username
),
)
output = ""
else:
running = True
await send_status(
message="Started with pid: {}...\nOutput: {}".format(
str(process.pid), output
),
routing_key="c2.status.{}.running.start.{}".format(
hostname, username
),
)
output = ""
else:
await send_status(
message="Already running...\nOutput: {}".format(output),
routing_key="c2.status.{}.running.start.{}".format(
hostname, username
),
)
output = ""
elif command == "stop":
if running:
try:
process.kill()
process.communicate()
except Exception as e:
pass
try:
thread.exit()
except Exception as e:
pass
running = False
await send_status(
message="Process killed...\nOld Output: {}".format(output),
routing_key="c2.status.{}.stopped.stop.{}".format(
hostname, username
),
)
output = ""
else:
await send_status(
message="Process not running...\nOld Output: {}".format(output),
routing_key="c2.status.{}.stopped.stop.{}".format(
hostname, username
),
)
output = ""
# make sure to stop the /Apfell/server in the background
elif command == "status":
if running:
await send_status(
message="Output: {}".format(output),
routing_key="c2.status.{}.running.status.{}".format(
hostname, username
),
)
output = ""
else:
await send_status(
message="C2 is not running",
routing_key="c2.status.{}.stopped.status.{}".format(
hostname, username
),
)
elif command == "get_config":
try:
path = container_files_path / "config.json"
file_data = open(path, "rb").read()
except Exception as e:
file_data = b"File not found"
encoded_data = json.dumps(
{
"filename": "config.json",
"data": base64.b64encode(file_data).decode("utf-8"),
}
)
await send_status(
message=encoded_data,
routing_key="c2.status.{}.{}.get_config.{}".format(
hostname, "running" if running else "stopped", username
),
)
elif command == "writefile":
try:
message = json.loads(message.body.decode("utf-8"))
file_path = container_files_path / message["file_path"]
file_path = file_path.resolve()
if container_files_path not in file_path.parents:
response = {
"status": "error",
"error": "trying to break out of path",
}
else:
file = open(file_path, "wb")
file.write(base64.b64decode(message["data"]))
file.close()
response = {"status": "success", "file": message["file_path"]}
except Exception as e:
response = {"status": "error", "error": str(e)}
await send_status(
message=json.dumps(response),
routing_key="c2.status.{}.{}.writefile.{}".format(
hostname, "running" if running else "stopped", username
),
)
elif command == "sync_classes":
try:
import_all_c2_functions()
# c2profile = {}
for cls in C2Profile.__subclasses__():
c2profile = cls().to_json()
break
await send_status(
message=json.dumps(c2profile),
routing_key="c2.status.{}.{}.sync_classes.{}".format(
hostname, "running" if running else "stopped", username
),
)
except Exception as e:
await send_status(
message='{"message": "Error while syncing info: {}"}'.format(
str(traceback.format_exc())
),
routing_key="c2.status.{}.{}.sync_classes.{}".format(
hostname, "running" if running else "stopped", username
),
)
else:
print("Unknown command: {}".format(command))
sys.stdout.flush()
except Exception as e:
print("Failed overall message processing: " + str(e))
sys.stdout.flush()
async def sync_classes():
try:
import_all_c2_functions()
c2profile = {}
for cls in C2Profile.__subclasses__():
c2profile = cls().to_json()
break
await send_status(
message=json.dumps(c2profile),
routing_key="c2.status.{}.{}.sync_classes.{}".format(
hostname, "stopped", ""
),
)
except Exception as e:
await send_status(
message='{"message": "Error while syncing info: {}"}'.format(
str(traceback.format_exc())
),
routing_key="c2.status.{}.{}.sync_classes.{}".format(
hostname, "stopped", ""
),
)
async def rabbit_c2_rpc_callback(
exchange: aio_pika.Exchange, message: aio_pika.IncomingMessage
):
with message.process():
request = json.loads(message.body.decode())
if "action" in request:
response = await globals()[request["action"]](request)
response = json.dumps(response.to_json()).encode()
else:
response = json.dumps(
{"status": "error", "error": "Missing action"}
).encode()
try:
await exchange.publish(
aio_pika.Message(body=response, correlation_id=message.correlation_id),
routing_key=message.reply_to,
)
except Exception as e:
print(
"Exception trying to send message back to container for rpc! " + str(e)
)
sys.stdout.flush()
async def connect_and_consume_rpc():
connection = None
global hostname
while connection is None:
try:
connection = await aio_pika.connect_robust(
host="127.0.0.1",
login="mythic_user",
password="mythic_password",
virtualhost="mythic_vhost",
)
channel = await connection.channel()
# get a random queue that only the apfell server will use to listen on to catch all heartbeats
queue = await channel.declare_queue("{}_rpc_queue".format(hostname))
await channel.set_qos(prefetch_count=50)
try:
task = queue.consume(
partial(rabbit_c2_rpc_callback, channel.default_exchange)
)
result = await asyncio.wait_for(task, None)
except Exception as e:
print("Exception in connect_and_consume .consume: {}".format(str(e)))
sys.stdout.flush()
except (ConnectionError, ConnectionRefusedError) as c:
print("Connection to rabbitmq failed, trying again...")
sys.stdout.flush()
except Exception as e:
print("Exception in connect_and_consume_rpc connect: {}".format(str(e)))
# print("Exception in connect_and_consume connect: {}".format(str(e)))
sys.stdout.flush()
await asyncio.sleep(2)
async def mythic_service():
global hostname
global exchange
global container_files_path
connection = None
config_file = open("rabbitmq_config.json", "rb")
main_config = json.loads(config_file.read().decode("utf-8"))
config_file.close()
if main_config["name"] == "hostname":
hostname = socket.gethostname()
else:
hostname = main_config["name"]
container_files_path = pathlib.Path(
os.path.abspath(main_config["container_files_path"])
)
container_files_path = container_files_path / "c2_code"
while connection is None:
try:
connection = await aio_pika.connect_robust(
host=main_config["host"],
login=main_config["username"],
password=main_config["password"],
virtualhost=main_config["virtual_host"],
)
except Exception as e:
await asyncio.sleep(2)
try:
channel = await connection.channel()
exchange = await channel.declare_exchange(
"mythic_traffic", aio_pika.ExchangeType.TOPIC
)
queue = await channel.declare_queue("", exclusive=True)
await queue.bind(
exchange="mythic_traffic", routing_key="c2.modify.{}.#".format(hostname)
)
# just want to handle one message at a time so we can clean up and be ready
await channel.set_qos(prefetch_count=30)
print("Listening for c2.modify.{}.#".format(hostname))
sys.stdout.flush()
task = queue.consume(callback)
await sync_classes()
task4 = asyncio.ensure_future(connect_and_consume_rpc())
result = await asyncio.gather(task, task4)
# send_status(message="", routing_key="c2.status.{}.stopped.stop".format(hostname))
except Exception as e:
print(str(traceback.format_exc()))
sys.stdout.flush()
async def heartbeat_loop():
config_file = open("rabbitmq_config.json", "rb")
main_config = json.loads(config_file.read().decode("utf-8"))
config_file.close()
if main_config["name"] == "hostname":
hostname = socket.gethostname()
else:
hostname = main_config["name"]
while True:
try:
connection = await aio_pika.connect_robust(
host=main_config["host"],
login=main_config["username"],
password=main_config["password"],
virtualhost=main_config["virtual_host"],
)
channel = await connection.channel()
# declare our heartbeat exchange that everybody will publish to, but only the apfell server will are about
exchange = await channel.declare_exchange(
"mythic_traffic", aio_pika.ExchangeType.TOPIC
)
except Exception as e:
print(str(e))
await asyncio.sleep(2)
continue
while True:
try:
# routing key is ignored for fanout, it'll go to anybody that's listening, which will only be the server
await exchange.publish(
aio_pika.Message("heartbeat".encode()),
routing_key="c2.heartbeat.{}".format(hostname),
)
await asyncio.sleep(10)
except Exception as e:
print(str(e))
# if we get an exception here, break out to the bigger loop and try to connect again
break
# start our service
loop = asyncio.get_event_loop()
loop.create_task(mythic_service())
loop.create_task(heartbeat_loop())
loop.run_forever()
@@ -1,8 +0,0 @@
{
"username": "mythic_user",
"password": "mythic_password",
"virtual_host": "mythic_vhost",
"host": "127.0.0.1",
"name": "hostname",
"container_files_path": "/Mythic/"
}
-1
View File
@@ -1 +0,0 @@
From itsafeaturemythic/python38_sanic_c2profile:0.0.1
@@ -1,141 +0,0 @@
{
"GET": {
"ServerBody": [
{
"function": "base64",
"parameters": []
},
{
"function": "prepend",
"parameters": ["!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(e,t){\"use strict\";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return\"function\"==typeof t&&\"number\"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement(\"script\");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?l[c.call(e)]||\"object\":typeof e}var b=\"3.3.1\",w=function(e,t){return new w.fn.init(e,t)},T=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;w.fn=w.prototype={jquery:\"3.3.1\",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:n.sort,splice:n.splice},w.extend=w.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for(\"boolean\"==typeof a&&(l=a,a=arguments[s]||{},s++),\"object\"==typeof a||g(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],a!==(r=e[t])&&(l&&r&&(w.isPlainObject(r)||(i=Array.isArray(r)))?(i?(i=!1,o=n&&Array.isArray(n)?n:[]):o=n&&w.isPlainObject(n)?n:{},a[t]=w.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},w.extend({expando:\"jQuery\"+(\"3.3.1\"+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||\"[object Object]\"!==c.call(e))&&(!(t=i(e))||\"function\"==typeof(n=f.call(t,\"constructor\")&&t.constructor)&&p.call(n)===d)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e){m(e)},each:function(e,t){var n,r=0;if(C(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?\"\":(e+\"\").replace(T,\"\")},makeArray:function(e,t){var n=t||[];return null!=e&&(C(Object(e))?w.merge(n,\"string\"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:u.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)(r=!t(e[o],o))!==s&&i.push(e[o]);return i},map:function(e,t,n){var r,i,o=0,s=[];if(C(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&s.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&s.push(i);return a.apply([],s)},guid:1,support:h}),\"function\"==typeof Symbol&&(w.fn[Symbol.iterator]=n[Symbol.iterator]),w.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(e,t){l[\"[object \"+t+\"]\"]=t.toLowerCase()});function C(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!g(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&t>0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b=\"sizzle\"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},P=\"\r"]
},
{
"function": "prepend",
"parameters": ["/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */"]
},
{
"function": "append",
"parameters": ["\".(o=t.documentElement,Math.max(t.body[\"scroll\"+e],o[\"scroll\"+e],t.body[\"offset\"+e],o[\"offset\"+e],o[\"client\"+e])):void 0===i?w.css(t,n,s):w.style(t,n,i,s)},t,a?i:void 0,a)}})}),w.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,t){w.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),w.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),w.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)}}),w.proxy=function(e,t){var n,r,i;if(\"string\"==typeof t&&(n=e[t],t=e,e=n),g(e))return r=o.call(arguments,2),i=function(){return e.apply(t||this,r.concat(o.call(arguments)))},i.guid=e.guid=e.guid||w.guid++,i},w.holdReady=function(e){e?w.readyWait++:w.ready(!0)},w.isArray=Array.isArray,w.parseJSON=JSON.parse,w.nodeName=N,w.isFunction=g,w.isWindow=y,w.camelCase=G,w.type=x,w.now=Date.now,w.isNumeric=function(e){var t=w.type(e);return(\"number\"===t||\"string\"===t)&&!isNaN(e-parseFloat(e))},\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return w});var Jt=e.jQuery,Kt=e.$;return w.noConflict=function(t){return e.$===w&&(e.$=Kt),t&&e.jQuery===w&&(e.jQuery=Jt),w},t||(e.jQuery=e.$=w),w});"]
}
],
"ServerHeaders": {
"Server": "NetDNA-cache/2.2",
"Cache-Control": "max-age=0, no-cache",
"Pragma": "no-cache",
"Connection": "keep-alive",
"Content-Type": "application/javascript; charset=utf-8"
},
"ServerCookies": {},
"AgentMessage": [{
"urls": ["http://192.168.205.151:9000"],
"uri": "/<test:string>",
"urlFunctions": [
{
"name": "<test:string>",
"value": "",
"transforms": [
{
"function": "choose_random",
"parameters": ["jquery-3.3.1.min.js","jquery-3.3.1.map"]
}
]
}
],
"AgentHeaders": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Host": "code.jquery.com",
"Referer": "http://code.jquery.com/",
"Accept-Encoding": "gzip, deflate",
"User-Agent": "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko"
},
"QueryParameters": [
{
"name": "q",
"value": "message",
"transforms": [
]
}
],
"Cookies": [
{
"name": "__cfduid",
"value": "",
"transforms": [
{
"function": "random_alpha",
"parameters": [30]
},
{
"function": "base64",
"parameters": []
}
]
}
],
"Body": []
}]
},
"POST": {
"ServerBody": [],
"ServerCookies": {},
"ServerHeaders": {
"Server": "NetDNA-cache/2.2",
"Cache-Control": "max-age=0, no-cache",
"Pragma": "no-cache",
"Connection": "keep-alive",
"Content-Type": "application/javascript; charset=utf-8"
},
"AgentMessage": [{
"urls": ["http://192.168.205.151:9000"],
"uri": "/download.php",
"urlFunctions": [],
"QueryParameters": [
{
"name": "bob2",
"value": "justforvalidation",
"transforms": []
}
],
"AgentHeaders": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Host": "code.jquery.com",
"Referer": "http://code.jquery.com/",
"Accept-Encoding": "gzip, deflate",
"User-Agent": "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko"
},
"Cookies": [
{
"name": "BobCookie",
"value": "splat",
"transforms": [
{
"function": "prepend",
"parameters": [
"splatity_"
]
}
]
}
],
"Body": [
{
"function": "base64",
"parameters": []
},
{
"function": "prepend",
"parameters": ["<html>"]
},
{
"function": "append",
"parameters": ["</html>"]
}
]
}]
},
"jitter": 50,
"interval": 10,
"chunk_size": 5120000,
"key_exchange": true,
"kill_date": ""
}
-160
View File
@@ -1,160 +0,0 @@
{
"instances": [
{
"GET": {
"ServerBody": [
{
"function": "base64",
"parameters": []
},
{
"function": "prepend",
"parameters": ["!function(e,t){\"use strict\";\"object\"==typeof module&&\"object\"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error(\"jQuery requires a window with a document\");return t(e)}:t(e)}(\"undefined\"!=typeof window?window:this,function(e,t){\"use strict\";var n=[],r=e.document,i=Object.getPrototypeOf,o=n.slice,a=n.concat,s=n.push,u=n.indexOf,l={},c=l.toString,f=l.hasOwnProperty,p=f.toString,d=p.call(Object),h={},g=function e(t){return\"function\"==typeof t&&\"number\"!=typeof t.nodeType},y=function e(t){return null!=t&&t===t.window},v={type:!0,src:!0,noModule:!0};function m(e,t,n){var i,o=(t=t||r).createElement(\"script\");if(o.text=e,n)for(i in v)n[i]&&(o[i]=n[i]);t.head.appendChild(o).parentNode.removeChild(o)}function x(e){return null==e?e+\"\":\"object\"==typeof e||\"function\"==typeof e?l[c.call(e)]||\"object\":typeof e}var b=\"3.3.1\",w=function(e,t){return new w.fn.init(e,t)},T=/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;w.fn=w.prototype={jquery:\"3.3.1\",constructor:w,length:0,toArray:function(){return o.call(this)},get:function(e){return null==e?o.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=w.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return w.each(this,e)},map:function(e){return this.pushStack(w.map(this,function(t,n){return e.call(t,n,t)}))},slice:function(){return this.pushStack(o.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(n>=0&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:s,sort:n.sort,splice:n.splice},w.extend=w.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for(\"boolean\"==typeof a&&(l=a,a=arguments[s]||{},s++),\"object\"==typeof a||g(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)n=a[t],a!==(r=e[t])&&(l&&r&&(w.isPlainObject(r)||(i=Array.isArray(r)))?(i?(i=!1,o=n&&Array.isArray(n)?n:[]):o=n&&w.isPlainObject(n)?n:{},a[t]=w.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},w.extend({expando:\"jQuery\"+(\"3.3.1\"+Math.random()).replace(/\\D/g,\"\"),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||\"[object Object]\"!==c.call(e))&&(!(t=i(e))||\"function\"==typeof(n=f.call(t,\"constructor\")&&t.constructor)&&p.call(n)===d)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e){m(e)},each:function(e,t){var n,r=0;if(C(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},trim:function(e){return null==e?\"\":(e+\"\").replace(T,\"\")},makeArray:function(e,t){var n=t||[];return null!=e&&(C(Object(e))?w.merge(n,\"string\"==typeof e?[e]:e):s.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:u.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r,i=[],o=0,a=e.length,s=!n;o<a;o++)(r=!t(e[o],o))!==s&&i.push(e[o]);return i},map:function(e,t,n){var r,i,o=0,s=[];if(C(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&s.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&s.push(i);return a.apply([],s)},guid:1,support:h}),\"function\"==typeof Symbol&&(w.fn[Symbol.iterator]=n[Symbol.iterator]),w.each(\"Boolean Number String Function Array Date RegExp Object Error Symbol\".split(\" \"),function(e,t){l[\"[object \"+t+\"]\"]=t.toLowerCase()});function C(e){var t=!!e&&\"length\"in e&&e.length,n=x(e);return!g(e)&&!y(e)&&(\"array\"===n||0===t||\"number\"==typeof t&&t>0&&t-1 in e)}var E=function(e){var t,n,r,i,o,a,s,u,l,c,f,p,d,h,g,y,v,m,x,b=\"sizzle\"+1*new Date,w=e.document,T=0,C=0,E=ae(),k=ae(),S=ae(),D=function(e,t){return e===t&&(f=!0),0},N={}.hasOwnProperty,A=[],j=A.pop,q=A.push,L=A.push,H=A.slice,O=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},P=\"\r"]
},
{
"function": "prepend",
"parameters": ["/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */"]
},
{
"function": "append",
"parameters": ["\".(o=t.documentElement,Math.max(t.body[\"scroll\"+e],o[\"scroll\"+e],t.body[\"offset\"+e],o[\"offset\"+e],o[\"client\"+e])):void 0===i?w.css(t,n,s):w.style(t,n,i,s)},t,a?i:void 0,a)}})}),w.each(\"blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu\".split(\" \"),function(e,t){w.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),w.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),w.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,\"**\"):this.off(t,e||\"**\",n)}}),w.proxy=function(e,t){var n,r,i;if(\"string\"==typeof t&&(n=e[t],t=e,e=n),g(e))return r=o.call(arguments,2),i=function(){return e.apply(t||this,r.concat(o.call(arguments)))},i.guid=e.guid=e.guid||w.guid++,i},w.holdReady=function(e){e?w.readyWait++:w.ready(!0)},w.isArray=Array.isArray,w.parseJSON=JSON.parse,w.nodeName=N,w.isFunction=g,w.isWindow=y,w.camelCase=G,w.type=x,w.now=Date.now,w.isNumeric=function(e){var t=w.type(e);return(\"number\"===t||\"string\"===t)&&!isNaN(e-parseFloat(e))},\"function\"==typeof define&&define.amd&&define(\"jquery\",[],function(){return w});var Jt=e.jQuery,Kt=e.$;return w.noConflict=function(t){return e.$===w&&(e.$=Kt),t&&e.jQuery===w&&(e.jQuery=Jt),w},t||(e.jQuery=e.$=w),w});"]
}
],
"ServerHeaders": {
"Server": "NetDNA-cache/2.2",
"Cache-Control": "max-age=0, no-cache",
"Pragma": "no-cache",
"Connection": "keep-alive",
"Content-Type": "application/javascript; charset=utf-8"
},
"ServerCookies": {},
"AgentMessage": [{
"urls": ["http://192.168.205.151:9000"],
"uri": "/<test:string>",
"urlFunctions": [
{
"name": "<test:string>",
"value": "",
"transforms": [
{
"function": "choose_random",
"parameters": ["jquery-3.3.1.min.js","jquery-3.3.1.map"]
}
]
}
],
"AgentHeaders": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Host": "code.jquery.com",
"Referer": "http://code.jquery.com/",
"Accept-Encoding": "gzip, deflate",
"User-Agent": "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko"
},
"QueryParameters": [
{
"name": "q",
"value": "message",
"transforms": [
]
}
],
"Cookies": [
{
"name": "__cfduid",
"value": "",
"transforms": [
{
"function": "random_alpha",
"parameters": [30]
},
{
"function": "base64",
"parameters": []
}
]
}
],
"Body": []
}]
},
"POST": {
"ServerBody": [],
"ServerCookies": {},
"ServerHeaders": {
"Server": "NetDNA-cache/2.2",
"Cache-Control": "max-age=0, no-cache",
"Pragma": "no-cache",
"Connection": "keep-alive",
"Content-Type": "application/javascript; charset=utf-8"
},
"AgentMessage": [{
"urls": ["http://192.168.205.151:9000"],
"uri": "/download.php",
"urlFunctions": [],
"QueryParameters": [
{
"name": "bob2",
"value": "justforvalidation",
"transforms": []
}
],
"AgentHeaders": {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Host": "code.jquery.com",
"Referer": "http://code.jquery.com/",
"Accept-Encoding": "gzip, deflate",
"User-Agent": "Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko"
},
"Cookies": [
{
"name": "BobCookie",
"value": "splat",
"transforms": [
{
"function": "prepend",
"parameters": [
"splatity_"
]
}
]
}
],
"Body": [
{
"function": "base64",
"parameters": []
},
{
"function": "prepend",
"parameters": ["<html>"]
},
{
"function": "append",
"parameters": ["</html>"]
}
]
}]
},
"no_match": {
"action": "return_file",
"redirect": "http://example.com",
"proxy_get": {
"url": "https://www.google.com",
"status": 200
},
"proxy_post": {
"url": "https://www.example.com",
"status": 200
},
"return_file": {
"name": "fake.html",
"status": 404
}
},
"port": 9000,
"key_path": "",
"cert_path": "",
"debug": false
}
]
}
@@ -1,595 +0,0 @@
#! /usr/bin/env python3
import json
import sys
import os
class bcolors:
HEADER = "\033[95m"
OKBLUE = "\033[94m"
OKGREEN = "\033[92m"
WARNING = "\033[93m"
FAIL = "\033[91m"
ENDC = "\033[0m"
BOLD = "\033[1m"
UNDERLINE = "\033[4m"
def check_server_layout(server_config):
if "instances" not in server_config:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} config.json must start with "instances"'
)
for inst in server_config["instances"]:
# loop through all the instances listed to see if the supplied config matches one of them
for method in ["GET", "POST"]:
if method not in inst:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "{method}" element in instance'
)
sys.exit(1)
if "ServerBody" not in inst[method]:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "ServerBody" array in {method}'
)
sys.exit(1)
for f in inst[method]["ServerBody"]:
if "function" not in f:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "function" name in {method} ServerBody'
)
sys.exit(1)
if "parameters" not in f:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "parameters" array in {method} in ServerBody (can be an empty array indicated by []'
)
sys.exit(1)
if "ServerHeaders" not in inst[method]:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "ServerHeaders" dictionary'
)
sys.exit(1)
if "ServerCookies" not in inst[method]:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "ServerCookies" dictionary'
)
sys.exit(1)
if "AgentMessage" not in inst[method]:
print(f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "AgentMessage" array')
sys.exit(1)
if len(inst[method]["AgentMessage"]) == 0:
print(
f'[*] "AgentMessage" array is empty, so you won\'t be able to do {method} messages'
)
for m in inst[method]["AgentMessage"]:
if "urls" not in m:
print(
'[-] Missing "urls" array indicating urls where the agent will reach out to'
)
sys.exit(1)
if "uri" not in m:
print(
'[-] Missing "uri" indicator of what the URI will be. If not in use, set to empty string'
)
sys.exit(1)
if "urlFunctions" not in m:
print(
'[-] Missing "urlFunctions" array, if you don\'t intent to do any manipulations here, set to empty array []'
)
sys.exit(1)
for f in m["urlFunctions"]:
if "name" not in f:
print('[-] Missing "name" parameter in urlFunction')
sys.exit(1)
if "value" not in f:
print(
'[-] Missing "value" parameter in urlFunction. This is the starting value before transforms are applied'
)
sys.exit(1)
if "transforms" not in f:
print(
'[-] Missing "transforms" array. If no transforms needed, set to empty array []'
)
sys.exit(1)
for t in f["transforms"]:
if "function" not in t:
print(
'[-] Missing "function" name in transforms in urlFunctions'
)
sys.exit(1)
if "parameters" not in t:
print(
'[-] Missing "parameters" array in transforms in urlFunctions (can be an empty array indicated by []'
)
sys.exit(1)
if "AgentHeaders" not in m:
print(
'[-] Missing "AgentHeaders" dictionary, this can be blank if the agent won\'t set any headers (i.e. {}'
)
sys.exit(1)
if "QueryParameters" not in m:
print(
'[-] Missing "QueryParameters" array in GET. If no query parameters will be set, leave as empty array []'
)
sys.exit(1)
for f in m["QueryParameters"]:
if "name" not in f:
print('[-] Missing "name" parameter in QueryParameters')
sys.exit(1)
if "value" not in f:
print(
'[-] Missing "value" parameter in QueryParameters. This is the starting value before transforms are applied'
)
sys.exit(1)
if "transforms" not in f:
print(
'[-] Missing "transforms" array. If no transforms needed, set to empty array []'
)
sys.exit(1)
for t in f["transforms"]:
if "function" not in t:
print(
'[-] Missing "function" name in transforms in QueryParameters'
)
sys.exit(1)
if "parameters" not in t:
print(
'[-] Missing "parameters" array in transforms in QueryParameters (can be an empty array indicated by []'
)
sys.exit(1)
if "Cookies" not in m:
print(
'[-] Missing "Cookies" array in GET. If none will be set, leave as empty array []'
)
sys.exit(1)
for f in m["Cookies"]:
if "name" not in f:
print('[-] Missing "name" parameter in Cookies')
sys.exit(1)
if "value" not in f:
print(
'[-] Missing "value" parameter in Cookies. This is the starting value before transforms are applied'
)
sys.exit(1)
if "transforms" not in f:
print(
'[-] Missing "transforms" array. If no transforms needed, set to empty array []'
)
sys.exit(1)
for t in f["transforms"]:
if "function" not in t:
print(
'[-] Missing "function" name in transforms in Cookies'
)
sys.exit(1)
if "parameters" not in t:
print(
'[-] Missing "parameters" array in transforms in Cookies (can be an empty array indicated by []'
)
sys.exit(1)
if "Body" not in m:
print(
'[-] Missing "Body" array in GET message. If none will be supplied, set as empty array []'
)
sys.exit(1)
if "no_match" not in inst:
print(f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "no_match" dictionary')
sys.exit(1)
if "action" not in inst["no_match"]:
print(f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "action" key in "no_match"')
sys.exit(1)
if inst["no_match"]["action"] not in [
"redirect",
"proxy_get",
"proxy_post",
"return_file",
]:
print(
f"{bcolors.FAIL}[-]{bcolors.ENDC} no_match action isn't in the approved list"
)
sys.exit(1)
if "redirect" not in inst["no_match"]:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "redirect" option in no_match'
)
sys.exit(1)
if "proxy_get" not in inst["no_match"]:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "proxy_get" option in no_match'
)
sys.exit(1)
if "url" not in inst["no_match"]["proxy_get"]:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "url" in no_match\'s proxy_get dictionary'
)
sys.exit(1)
if "status" not in inst["no_match"]["proxy_get"]:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "status" code for no_match\'s proxy_get dictionary'
)
sys.exit(1)
if "proxy_post" not in inst["no_match"]:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "proxy_post" option in no_match'
)
sys.exit(1)
if "url" not in inst["no_match"]["proxy_post"]:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "url" in no_match\'s proxy_post dictionary'
)
sys.exit(1)
if "status" not in inst["no_match"]["proxy_post"]:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "status" code in no_match\'s proxy_post dictionary'
)
sys.exit(1)
if "return_file" not in inst["no_match"]:
print(f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "return_file" in no_match')
sys.exit(1)
if "name" not in inst["no_match"]["return_file"]:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "name" for the file to be returned in no_match case'
)
sys.exit(1)
if not os.path.exists(inst["no_match"]["return_file"]["name"]):
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} File specified in "no_match" case for "return_file" can\'t be found'
)
sys.exit(1)
if "status" not in inst["no_match"]["return_file"]:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Misisng "status" return code for no_match\'s return_file'
)
sys.exit(1)
if "port" not in inst:
print(f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "port" in instance')
sys.exit(1)
if "key_path" not in inst:
print(f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "key_path" in instance')
sys.exit(1)
if inst["key_path"] != "" and not os.path.exists(inst["key_path"]):
print(f"{bcolors.FAIL}[-]{bcolors.ENDC} Key_path file can't be found")
sys.exit(1)
if "cert_path" not in inst:
print(f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "cert_path" in instance')
sys.exit(1)
if inst["cert_path"] != "" and not os.path.exists(inst["cert_path"]):
print(f"{bcolors.FAIL}[-]{bcolors.ENDC} cert_path file can't be found")
sys.exit(1)
if "debug" not in inst:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "debug" boolean in instance'
)
sys.exit(1)
def check_agent_config_layout(inst):
for method in ["GET", "POST"]:
if method not in inst:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "{method}" element in instance'
)
sys.exit(1)
if "ServerBody" not in inst[method]:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "ServerBody" array in {method}'
)
sys.exit(1)
for f in inst[method]["ServerBody"]:
if "function" not in f:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "function" name in {method} ServerBody'
)
sys.exit(1)
if "parameters" not in f:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "parameters" array in {method} in ServerBody (can be an empty array indicated by []'
)
sys.exit(1)
if "ServerHeaders" not in inst[method]:
print(f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "ServerHeaders" dictionary')
sys.exit(1)
if "ServerCookies" not in inst[method]:
print(f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "ServerCookies" dictionary')
sys.exit(1)
if "AgentMessage" not in inst[method]:
print(f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "AgentMessage" array')
sys.exit(1)
if len(inst[method]["AgentMessage"]) == 0:
print(
f'[*] "AgentMessage" array is empty, so you won\'t be able to do {method} messages'
)
for m in inst[method]["AgentMessage"]:
if "urls" not in m:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "urls" array indicating urls where the agent will reach out to'
)
sys.exit(1)
if "uri" not in m:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "uri" indicator of what the URI will be. If not in use, set to empty string'
)
sys.exit(1)
if "urlFunctions" not in m:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "urlFunctions" array, if you don\'t intent to do any manipulations here, set to empty array []'
)
sys.exit(1)
for f in m["urlFunctions"]:
if "name" not in f:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "name" parameter in urlFunction'
)
sys.exit(1)
if "value" not in f:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "value" parameter in urlFunction. This is the starting value before transforms are applied'
)
sys.exit(1)
if "transforms" not in f:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "transforms" array. If no transforms needed, set to empty array []'
)
sys.exit(1)
for t in f["transforms"]:
if "function" not in t:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "function" name in transforms in urlFunctions'
)
sys.exit(1)
if "parameters" not in t:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "parameters" array in transforms in urlFunctions (can be an empty array indicated by []'
)
sys.exit(1)
if "AgentHeaders" not in m:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "AgentHeaders" dictionary, this can be blank if the agent won\'t set any headers'
)
sys.exit(1)
if "QueryParameters" not in m:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "QueryParameters" array in GET. If no query parameters will be set, leave as empty array []'
)
sys.exit(1)
for f in m["QueryParameters"]:
if "name" not in f:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "name" parameter in QueryParameters'
)
sys.exit(1)
if "value" not in f:
print(
'[-] Missing "value" parameter in QueryParameters. This is the starting value before transforms are applied'
)
sys.exit(1)
if "transforms" not in f:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "transforms" array. If no transforms needed, set to empty array []'
)
sys.exit(1)
for t in f["transforms"]:
if "function" not in t:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "function" name in transforms in QueryParameters'
)
sys.exit(1)
if "parameters" not in t:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "parameters" array in transforms in QueryParameters (can be an empty array indicated by []'
)
sys.exit(1)
if "Cookies" not in m:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "Cookies" array in GET. If none will be set, leave as empty array []'
)
sys.exit(1)
for f in m["Cookies"]:
if "name" not in f:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "name" parameter in Cookies'
)
sys.exit(1)
if "value" not in f:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "value" parameter in Cookies. This is the starting value before transforms are applied'
)
sys.exit(1)
if "transforms" not in f:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "transforms" array. If no transforms needed, set to empty array []'
)
sys.exit(1)
for t in f["transforms"]:
if "function" not in t:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "function" name in transforms in Cookies'
)
sys.exit(1)
if "parameters" not in t:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "parameters" array in transforms in Cookies (can be an empty array indicated by []'
)
sys.exit(1)
if "Body" not in m:
print(
f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "Body" array in GET message. If none will be supplied, set as empty array []'
)
sys.exit(1)
if "jitter" not in inst:
print(f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "jitter"')
sys.exit(1)
if "interval" not in inst:
print(f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "interval"')
sys.exit(1)
if "chunk_size" not in inst:
print(f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "chunk_size"')
sys.exit(1)
if "key_exchange" not in inst:
print(f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "key_exchange" boolean')
sys.exit(1)
if "kill_date" not in inst:
print(f'{bcolors.FAIL}[-]{bcolors.ENDC} Missing "kill_date"')
sys.exit(1)
def check_config(server_config, agent_config, method):
# get info for agent config
agent_message = {"location": "", "value": "", "method": method}
print(f"{bcolors.OKBLUE}[*]{bcolors.ENDC} Looking into {method} AgentMessages")
for g in agent_config[method]["AgentMessage"]:
# we need to find where the "message" parameter exists so we know where the data will be
agent_message["urls"] = g["urls"]
agent_message["uri"] = g["uri"]
print(
f"{bcolors.OKBLUE}[*]{bcolors.ENDC} Current URLs: {g['urls']}\n\tCurrent URI: {g['uri']}"
)
for p in g["QueryParameters"]:
if p["value"] == "message":
print(
f"{bcolors.OKBLUE}[*]{bcolors.ENDC} Found 'message' keyword in QueryParameter {p['name']}"
)
agent_message["location"] = "QueryParameters"
agent_message["value"] = p
for p in g["Cookies"]:
if p["value"] == "message":
print(
f"{bcolors.OKBLUE}[*]{bcolors.ENDC} Found 'message' keyword in Cookies {p['name']}"
)
agent_message["location"] = "Cookies"
agent_message["value"] = p
for p in g["urlFunctions"]:
if p["name"] == "<message:string>":
print(
f"{bcolors.OKBLUE}[*]{bcolors.ENDC} Found '<message:string>' keyword in urlFunctions"
)
agent_message["location"] = "URI"
agent_message["value"] = p
if agent_message["location"] == "":
# if we haven't set it yet, data must be in the body
print(
f"{bcolors.OKBLUE}[*]{bcolors.ENDC} Didn't find message keyword anywhere, assuming it to be the Body of the message"
)
agent_message["location"] = "Body"
agent_message["value"] = g["Body"]
print(
f"{bcolors.OKBLUE}[*]{bcolors.ENDC} Now checking server config for matching section"
)
check_match_to_server(server_config, agent_message)
def check_match_to_server(server_config, agent_message):
for inst in server_config["instances"]:
# only look into AgentMessage details if the urls and uri match
for g in inst[agent_message["method"]]["AgentMessage"]:
match = False
if agent_message["uri"] != g["uri"]:
continue
if not urls_match(agent_message["urls"], g["urls"]):
continue
else:
print(
f"{bcolors.OKBLUE}[*]{bcolors.ENDC} Found matching URLs and URI, checking rest of AgentMessage"
)
if agent_message["location"] == "Body":
print(
f"{bcolors.OKBLUE}[*]{bcolors.ENDC} Checking for matching Body messages"
)
match = body_match(g["Body"], agent_message["value"])
else:
match = contains_element(
agent_message["value"], g[agent_message["location"]]
)
if match:
print(f"{bcolors.OKGREEN}[+]{bcolors.ENDC} FOUND MATCH")
return True
else:
print(
f"{bcolors.FAIL}[-]{bcolors.ENDC} Matched URLs/URI failed to match AgentMessages"
)
return False
print(f"{bcolors.FAIL}[-]{bcolors.ENDC} Failed to find any matching URLs/URIs")
return False
def transforms_match(arr1, arr2):
if len(arr1) != len(arr2):
return False
for i in range(len(arr1)):
if arr1[i]["function"] != arr2[i]["function"]:
return False
if len(arr1[i]["parameters"]) != len(arr2[i]["parameters"]):
return False
for j in range(len(arr1[i]["parameters"])):
if arr1[i]["parameters"][j] != arr2[i]["parameters"][j]:
return False
return True
def body_match(arr1, arr2):
if len(arr1) != len(arr2):
return False
for e in range(len(arr1)):
if arr1[e]["function"] != arr2[e]["function"]:
return False
if len(arr1[e]["parameters"]) != len(arr2[e]["parameters"]):
return False
for p in range(len(arr1[e]["parameters"])):
if arr1[e]["parameters"][p] != arr2[e]["parameters"][p]:
return False
return True
def contains_element(ele, arr):
# check if arr contains ele
for i in arr:
if i["name"] == ele["name"]:
if i["value"] == ele["value"]:
if transforms_match(ele["transforms"], i["transforms"]):
return True
return False
def urls_match(arr1, arr2):
if len(arr1) != len(arr2):
return False
for i in range(len(arr1)):
if arr1[i] not in arr2:
return False
return True
if __name__ == "__main__":
if os.path.exists("config.json"):
server_config = json.load(open("config.json"))
else:
print(f"{bcolors.FAIL}[-]{bcolors.ENDC} Can't find config.json")
sys.exit(1)
if len(sys.argv) < 2:
print(
f"{bcolors.FAIL}[-]{bcolors.ENDC} Please specify an agent config file on the command line"
)
sys.exit(1)
if os.path.exists(sys.argv[1]):
agent_config = json.load(open(sys.argv[1]))
else:
print(f"{bcolors.FAIL}[-]{bcolors.ENDC} Can't find the supplied file")
sys.exit(1)
# first, check that the two configs have all the right pieces
print(
f"{bcolors.OKBLUE}[*]{bcolors.ENDC} Checking server config for layout structure"
)
check_server_layout(server_config)
print(f"{bcolors.OKGREEN}[+]{bcolors.ENDC} Server config layout structure is good")
print(
f"{bcolors.OKBLUE}[*]{bcolors.ENDC} Checking agent config for layout structure"
)
check_agent_config_layout(agent_config)
print(f"{bcolors.OKGREEN}[+]{bcolors.ENDC} Agent config layout structure is good")
# now check that server_config can understand an agent_config message
# first check a GET request
check_config(server_config, agent_config, "GET")
check_config(server_config, agent_config, "POST")
-10
View File
@@ -1,10 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Page Not Found!</title>
</head>
<body>
</body>
</html>
-353
View File
@@ -1,353 +0,0 @@
#!/usr/bin/env python3
from sanic import Sanic
from sanic.response import html, redirect, raw
from sanic.exceptions import NotFound
import sys
import asyncio
import ssl
from pathlib import Path
import json
import requests
import base64 as b64
import random
import os
config = {}
async def r_base64(*args):
# called with base64(value)
if isinstance(args[0], str):
return b64.b64decode(args[0].encode())
else:
return b64.b64decode(args[0])
async def base64(*args):
# called with base64(value)
return b64.b64encode(args[0]).decode('utf-8')
async def r_prepend(*args):
# called with prepend(value, "string")
return args[0][len(args[1]):]
async def prepend(*args):
# called with prepend(value, "string")
return str(args[1]) + str(args[0])
async def r_append(*args):
# called with append(value, "string")
return args[0][:len(args[0]) - len(args[1])]
async def append(*args):
# called with append(value, "string")
return args[0] + args[1]
async def random_mixed(*args):
# called with random_mixed(value, 10), always appends
letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
rnd = ''.join(random.choice(letters) for i in range(args[1]))
return args[0] + rnd
async def r_random_mixed(*args):
# called with random_mixed(value, 10), always appends
# return the string going from 0 to -10 (or ten from the end)
return args[0][: -1 * args[1]]
async def random_number(*args):
# called with random_number(value, 10)
letters = "0987654321"
rnd = ''.join(random.choice(letters) for i in range(args[1]))
return args[0] + rnd
async def r_random_number(*args):
# called with random_mixed(value, 10), always appends
# return the string going from 0 to -10 (or ten from the end)
return args[0][: -1 * args[1]]
async def random_alpha(*args):
# called with random_alpha(value, 10), always appends
letters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
rnd = ''.join(random.choice(letters) for i in range(args[1]))
return args[0] + rnd
async def r_random_alpha(*args):
# called with random_mixed(value, 10), always appends
# return the string going from 0 to -10 (or ten from the end)
return args[0][: -1 * args[1]]
async def choose_random(*args):
# called with choose_random(value, opt1, opt2, opt3...)
choice = random.choice(args[1:])
return args[0] + choice
async def r_choose_random(*args):
# called with choose_random(value, opt1, opt2, opt3...)
for e in args[1:]:
if e in args[0]:
return args[0].replace(e, "", 1)
async def get_value(value, transforms):
# given an obfuscated value, apply transforms to get back the value we need
# await print_flush(transforms)
for step in transforms[::-1]:
value = await globals()["r_" + step['function']](value, *step['parameters'])
return value
async def create_value(value, transforms):
for step in transforms:
# await print_flush("in create_value: value: {}\n".format(value))
value = await globals()[step['function']](value, *step['parameters'])
return value
async def create_response(request, data, status=200, method="POST"):
try:
if config[request.app.name]['debug']:
await print_flush("calling create_value for data: {}\nwith transforms: {}\n".format(data, config[request.app.name][method]['ServerBody']))
data = await create_value(data, config[request.app.name][method]['ServerBody'])
headers = config[request.app.name][method]['ServerHeaders']
cookies = config[request.app.name][method]['ServerCookies']
if config[request.app.name]['debug']:
await print_flush("response of: {}".format(data))
await print_flush("response data: {}\n".format(data))
await print_flush("response headers: {}\n".format(headers))
await print_flush("response_cookies: {}\n".format(cookies))
if isinstance(data, str):
data = data.encode()
response = raw(data, status=status, headers=headers)
for key in cookies.items():
response.cookies[key] = cookies[key]
return response
except Exception as e:
if config[request.app.name]['debug']:
await print_flush("error in create_response: {}".format(str(e)))
return html("Error: Requested URL {} not found\n".format(request.url), status=404)
async def no_match(request, exception):
global config
if config[request.app.name]['debug']:
await print_flush("hit a 'no_match' case")
if config[request.app.name]['no_match']['action'] == "":
return await create_response(request, data="Error: Requested URL {} not found".format(request.url), status=404)
elif config[request.app.name]['no_match']['action'] == 'redirect':
return redirect(config[request.app.name]['no_match']['redirect'])
elif config[request.app.name]['no_match']['action'] == 'proxy_get':
resp = requests.get(config[request.app.name]['no_match']['proxy_get']['url'], verify=False)
return await create_response(request, data=resp.content, status=config[request.app.name]['no_match']['proxy_get']['status'])
elif config[request.app.name]['no_match']['action'] == 'proxy_post':
resp = requests.post(config[request.app.name]['no_match']['proxy_post']['url'], data=request.body, verify=False)
return await create_response(request, data=resp.content, status=config[request.app.name]['no_match']['proxy_post']['status'])
elif config[request.app.name]['no_match']['action'] == 'return_file':
content = open(config[request.app.name]['no_match']['return_file']['name'], 'r').read()
return await create_response(request, data=content, status=config[request.app.name]['no_match']['return_file']['status'])
async def print_flush(message):
print(message)
sys.stdout.flush()
async def get_base_values(request, method: str, mythic_endpoint: str, **kwargs):
value = None
transforms = None
try:
if config[request.app.name][method][mythic_endpoint]['location'] == 'URI':
value = kwargs["message"]
transforms = {}
elif config[request.app.name][method][mythic_endpoint]['location'] == 'QueryParameters':
value = request.args[config[request.app.name][method][mythic_endpoint]['value']['name']][0]
transforms = config[request.app.name][method][mythic_endpoint]['value']['transforms']
elif config[request.app.name][method][mythic_endpoint]['location'] == 'Cookies':
value = request.cookies.get(config[request.app.name][method][mythic_endpoint]['value']['name'])
transforms = config[request.app.name][method][mythic_endpoint]['value']['transforms']
elif config[request.app.name][method][mythic_endpoint]['location'] == 'Body':
value = request.body
transforms = config[request.app.name][method][mythic_endpoint]['value']
else:
if config[request.app.name]['debug']:
await print_flush("{} failed to find required parameter".format(mythic_endpoint))
return None, None
if config[request.app.name]['debug']:
await print_flush("Got value: {}\nGot transforms: {}\n".format(value, transforms))
except Exception as e:
if config[request.app.name]['debug']:
await print_flush("Failed to get a value: {}, {}".format(mythic_endpoint, str(e)))
return value, transforms
async def get_agent_message(request, **kwargs):
global config
try:
if config[request.app.name]['debug']:
await print_flush("get_agent_message request from: {} with {} and {}".format(request.url, request.cookies, request.headers))
# find the agent value and the transforms needed to get the real value out
message, transforms = await get_base_values(request, 'GET', request.uri_template, **kwargs)
if message is None:
# this means we failed to find our message
return await no_match(request, NotFound)
# given the message location and transforms, extract the actual value
message = await get_value(message, transforms)
if config[request.app.name]['debug']:
await print_flush("Forwarding along to: {}".format(config['mythic_address']))
response = requests.post(config['mythic_address'], verify=False, data=message)
return await create_response(request, data=response.content, status=response.status_code, method="GET")
except Exception as e:
if config[request.app.name]['debug']:
await print_flush("error in get_agent_message: {}".format(str(e)))
return await no_match(request, NotFound)
async def post_agent_message(request, **kwargs):
global config
try:
if config[request.app.name]['debug']:
await print_flush("post_agent_message request from: {} with {} and {}".format(request.url, request.cookies, request.headers))
message, agent_transforms = await get_base_values(request, 'POST', request.uri_template, **kwargs)
if message is None:
return await no_match(request, NotFound)
message = await get_value(message, agent_transforms)
if config[request.app.name]['debug']:
await print_flush("Forwarding along to: {}".format(config['mythic_address']))
response = requests.post(config['mythic_address'], data=message, verify=False)
return await create_response(request, data=response.content, status=response.status_code, method="POST")
except Exception as e:
if config[request.app.name]['debug']:
await print_flush("error in post_agent_message: {}".format(str(e)))
return await no_match(request, NotFound)
if __name__ == "__main__":
config_file = open("config.json", 'rb')
main_config = json.loads(config_file.read().decode('utf-8'))
print("Opening config and starting instances...")
sys.stdout.flush()
# basic mapping of the general endpoints to the real endpoints
config['mythic_address'] = os.environ['MYTHIC_ADDRESS']
# now look at the specific instances to start
for inst in main_config['instances']:
config[str(inst['port'])] = {'debug': inst['debug'],
'no_match': inst['no_match'],
'POST': { # these are server response configurations
'ServerHeaders': inst['POST']['ServerHeaders'],
'ServerCookies': inst['POST']['ServerCookies'],
'ServerBody': inst['POST']['ServerBody']
},
"GET": { # these are server response configurations
'ServerHeaders': inst['GET']['ServerHeaders'],
'ServerCookies': inst['GET']['ServerCookies'],
'ServerBody': inst['GET']['ServerBody']
}}
if inst['debug']:
print("Debugging output is enabled. This might be a performance it, but gives more context")
else:
print("Debugging output is disabled")
sys.stdout.flush()
# now to create an app instance too handle responses
app = Sanic(str(inst['port']))
app.config['REQUEST_MAX_SIZE'] = 1000000000
app.config['REQUEST_TIMEOUT'] = 600
app.config['RESPONSE_TIMEOUT'] = 600
app.error_handler.add(Exception, no_match)
# do a little extra processing here once so we don't have to do extra processing for each request
# for each endpoint need to track:
# 1. where the data is located (URI, query, cookie, body, header)
# 2. what needs to be done to access the value
# (access specific field, certain offset into data, decode first, etc)
# 3. what needs to be done to get the final value out (decode, remove extra data, etc)
# an instance can have multiple URLs and schemes for each GET/POST, so loop through all of that
for g in inst['GET']['AgentMessage']:
app.add_route(get_agent_message, g['uri'], methods=['GET'])
config[str(inst['port'])]['GET'][g['uri']] = {}
# we need to find where the "message" parameter exists so we know where the data will be
for p in g['QueryParameters']:
if p['value'] == "message":
config[str(inst['port'])]['GET'][g['uri']]['location'] = "QueryParameters"
config[str(inst['port'])]['GET'][g['uri']]['value'] = p
for p in g['Cookies']:
if p['value'] == 'message':
config[str(inst['port'])]['GET'][g['uri']]['location'] = "Cookies"
config[str(inst['port'])]['GET'][g['uri']]['value'] = p
for p in g['urlFunctions']:
if p['name'] == '<message:string>':
config[str(inst['port'])]['GET'][g['uri']]['location'] = "URI"
config[str(inst['port'])]['GET'][g['uri']]['value'] = p
if 'location' not in config[str(inst['port'])]['GET'][g['uri']]:
# if we haven't set it yet, data must be in the body
config[str(inst['port'])]['GET'][g['uri']]['location'] = "Body"
config[str(inst['port'])]['GET'][g['uri']]['value'] = g['Body']
for g in inst['POST']['AgentMessage']:
app.add_route(post_agent_message, g['uri'], methods=['POST'])
config[str(inst['port'])]['POST'][g['uri']] = {}
# we need to find where the "message" parameter exists so we know where the data will be
for p in g['QueryParameters']:
if p['value'] == "message":
config[str(inst['port'])]['POST'][g['uri']]['location'] = "QueryParameters"
config[str(inst['port'])]['POST'][g['uri']]['value'] = p
for p in g['Cookies']:
if p['value'] == 'message':
config[str(inst['port'])]['POST'][g['uri']]['location'] = "Cookies"
config[str(inst['port'])]['POST'][g['uri']]['value'] = p
for p in g['urlFunctions']:
if p['name'] == '<message:string>':
config[str(inst['port'])]['POST'][g['uri']]['location'] = "URI"
config[str(inst['port'])]['POST'][g['uri']]['value'] = p
if 'location' not in config[str(inst['port'])]['POST'][g['uri']]:
# if we haven't set it yet, data must be in the body
config[str(inst['port'])]['POST'][g['uri']]['location'] = "Body"
config[str(inst['port'])]['POST'][g['uri']]['value'] = g['Body']
keyfile = Path(inst['key_path'])
certfile = Path(inst['cert_path'])
if keyfile.is_file() and certfile.is_file():
context = ssl.create_default_context(purpose=ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain(inst['cert_path'], keyfile=inst['key_path'])
if inst['debug']:
server = app.create_server(host="0.0.0.0", port=inst['port'], ssl=context, debug=False, return_asyncio_server=True, access_log=True)
else:
server = app.create_server(host="0.0.0.0", port=inst['port'], ssl=context, debug=False, return_asyncio_server=True, access_log=False)
if inst['debug']:
print("using SSL for port {}".format(inst['port']))
sys.stdout.flush()
else:
if inst['debug']:
print("not using SSL for port {}".format(inst['port']))
sys.stdout.flush()
if inst['debug']:
server = app.create_server(host="0.0.0.0", port=inst['port'], debug=False, return_asyncio_server=True, access_log=True)
else:
server = app.create_server(host="0.0.0.0", port=inst['port'], debug=False, return_asyncio_server=True, access_log=False)
task = asyncio.ensure_future(server)
try:
loop = asyncio.get_event_loop()
def callback(fut):
try:
fetch_count = fut.result()
except OSError as e:
print("probably the port set is being used")
fut.get_loop().stop()
task.add_done_callback(callback)
loop.run_forever()
except:
loop.stop()
@@ -1,130 +0,0 @@
from enum import Enum
from abc import abstractmethod
import json
class ParameterType(Enum):
String = "String"
ChooseOne = "ChooseOne"
Array = "Array"
Date = "Date"
Dictionary = "Dictionary"
class C2ProfileParameter:
def __init__(
self,
name: str,
description: str,
default_value: str = "",
randomize: bool = False,
format_string: str = "",
parameter_type: ParameterType = ParameterType.String,
required: bool = True,
verifier_regex: str = "",
choices: [str] = None,
):
self.name = name
self.description = description
self.randomize = randomize
self.format_string = format_string
self.parameter_type = parameter_type
self.required = required
self.verifier_regex = verifier_regex
self.choices = choices
self.default_value = ""
if self.parameter_type == ParameterType.ChooseOne and choices is not None:
self.default_value = "\n".join(choices)
else:
self.default_value = default_value
def to_json(self):
return {
"name": self.name,
"description": self.description,
"default_value": self.default_value if self.parameter_type not in [ParameterType.Array, ParameterType.Dictionary] else json.dumps(self.default_value),
"randomize": self.randomize,
"format_string": self.format_string,
"required": self.required,
"parameter_type": self.parameter_type.value,
"verifier_regex": self.verifier_regex,
}
class C2Profile:
@property
@abstractmethod
def name(self):
pass
@property
@abstractmethod
def description(self):
pass
@property
@abstractmethod
def author(self):
pass
@property
@abstractmethod
def is_p2p(self):
pass
@property
@abstractmethod
def is_server_routed(self):
pass
@property
@abstractmethod
def mythic_encrypts(self):
pass
@property
@abstractmethod
def parameters(self):
pass
def to_json(self):
return {
"name": self.name,
"description": self.description,
"author": self.author,
"mythic_encrypts": self.mythic_encrypts,
"is_p2p": self.is_p2p,
"is_server_routed": self.is_server_routed,
"params": [x.to_json() for x in self.parameters],
}
class RPCStatus(Enum):
Success = "success"
Error = "error"
class RPCResponse:
def __init__(self, status: RPCStatus = None, response: str = None):
self.status = status
self.response = response
@property
def status(self):
return self._status
@status.setter
def status(self, status):
self._status = status
@property
def response(self):
return self._response
@response.setter
def response(self, response):
self._response = response
def to_json(self):
return {"status": self.status.value, "response": self.response}
@@ -1,99 +0,0 @@
from aio_pika import connect_robust, IncomingMessage, Message
import asyncio
import uuid
import json
from enum import Enum
class MythicStatus(Enum):
Success = "success"
Error = "error"
class RPCResponse:
def __init__(self, resp: dict):
self._raw_resp = resp
if resp["status"] == "success":
self.status = MythicStatus.Success
self.response = resp["response"] if "response" in resp else ""
self.error_message = None
else:
self.status = MythicStatus.Error
self.error_message = resp["error"]
self.response = None
@property
def status(self):
return self._status
@status.setter
def status(self, status):
self._status = status
@property
def error_message(self):
return self._error_message
@error_message.setter
def error_message(self, error_message):
self._error_message = error_message
@property
def response(self):
return self._response
@response.setter
def response(self, response):
self._response = response
class MythicBaseRPC:
def __init__(self):
self.connection = None
self.channel = None
self.callback_queue = None
self.futures = {}
self.loop = asyncio.get_event_loop()
async def connect(self):
config_file = open("/Mythic/mythic/rabbitmq_config.json", "rb")
main_config = json.loads(config_file.read().decode("utf-8"))
config_file.close()
self.connection = await connect_robust(
host=main_config["host"],
login=main_config["username"],
password=main_config["password"],
virtualhost=main_config["virtual_host"],
)
self.channel = await self.connection.channel()
self.callback_queue = await self.channel.declare_queue(exclusive=True)
await self.callback_queue.consume(self.on_response)
return self
def on_response(self, message: IncomingMessage):
future = self.futures.pop(message.correlation_id)
future.set_result(message.body)
async def call(self, n, receiver: str = None) -> RPCResponse:
if self.connection is None:
await self.connect()
correlation_id = str(uuid.uuid4())
future = self.loop.create_future()
self.futures[correlation_id] = future
if receiver is None:
router = "c2rpc_queue"
else:
router = "{}_rpc_queue".format(receiver)
await self.channel.default_exchange.publish(
Message(
json.dumps(n).encode(),
content_type="application/json",
correlation_id=correlation_id,
reply_to=self.callback_queue.name,
),
routing_key=router,
)
return RPCResponse(json.loads(await future))
@@ -1,124 +0,0 @@
from MythicBaseRPC import *
import base64
class MythicRPCResponse(RPCResponse):
def __init__(self, resp: RPCResponse):
super().__init__(resp._raw_resp)
if resp.status == MythicStatus.Success:
self.data = resp.response
else:
self.data = None
@property
def data(self):
return self._data
@data.setter
def data(self, data):
self._data = data
class MythicCallbackRPC(MythicBaseRPC):
# returns dictionary of `{"raw": raw_tasking, "encrypted": base64(uuid+encrypted_tasking)}`
async def get_tasking(
self, uuid: str, tasking_size: int = 1
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "get_tasking",
"uuid": uuid,
"tasking_size": tasking_size,
}
)
return MythicRPCResponse(resp)
async def add_route(
self,
source_uuid: str,
destination_uuid: str,
direction: int = 1,
metadata: str = None,
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "add_route",
"source": source_uuid,
"destination": destination_uuid,
"direction": direction,
"metadata": metadata,
}
)
return MythicRPCResponse(resp)
async def remove_route(
self,
source_uuid: str,
destination_uuid: str,
direction: int = 1,
metadata: str = None,
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "remove_route",
"source": source_uuid,
"destination": destination_uuid,
"direction": direction,
"metadata": metadata,
}
)
return MythicRPCResponse(resp)
async def get_callback_info(self, uuid: str) -> MythicRPCResponse:
resp = await self.call({"action": "get_callback_info", "uuid": uuid})
return MythicRPCResponse(resp)
async def get_encryption_data(self, uuid: str, profile: str) -> MythicRPCResponse:
resp = await self.call(
{
"action": "get_encryption_data",
"uuid": uuid,
"c2_profile": profile,
}
)
return MythicRPCResponse(resp)
async def update_callback_info(self, uuid: str, info: dict) -> MythicRPCResponse:
resp = await self.call(
{"action": "update_callback_info", "uuid": uuid, "data": info}
)
return MythicRPCResponse(resp)
async def add_event_message(
self, message: str, level: str = "info"
) -> MythicRPCResponse:
resp = await self.call(
{"action": "add_event_message", "level": level, "message": message}
)
return MythicRPCResponse(resp)
async def encrypt_bytes(
self, data: bytes, uuid: str, with_uuid: bool = False,
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "encrypt_bytes",
"data": base64.b64encode(data).decode(),
"uuid": uuid,
"with_uuid": with_uuid,
}
)
return MythicRPCResponse(resp)
async def decrypt_bytes(
self, data: bytes, uuid: str, with_uuid: bool = False,
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "decrypt_bytes",
"uuid": uuid,
"data": base64.b64encode(data).decode(),
"with_uuid": with_uuid,
}
)
return MythicRPCResponse(resp)
@@ -1,11 +0,0 @@
from C2ProfileBase import *
import MythicCallbackRPC
# request is a dictionary: {"action": func_name, "message": "the input", "task_id": task id num}
# must return an RPCResponse() object and set .status to an instance of RPCStatus and response to str of message
async def test(request):
response = RPCResponse()
response.status = RPCStatus.Success
response.response = "hello"
#resp = await MythicCallbackRPC.MythicCallbackRPC().add_event_message(message="got a POST message")
return response
Whitespace-only changes.
@@ -1,18 +0,0 @@
from C2ProfileBase import *
class DynamicHTTP(C2Profile):
name = "dynamicHTTP"
description = "Manipulate HTTP(S) requests and responses"
author = "@its_a_feature_"
is_p2p = False
is_server_routed = False
mythic_encrypts = True
parameters = [
C2ProfileParameter(
name="AESPSK", description="Base64 of a 32B AES Key", default_value=""
),
C2ProfileParameter(
name="raw_c2_config", description="Agent JSON Config", default_value=""
),
]
@@ -1,7 +0,0 @@
#!/bin/bash
cd /Mythic/mythic
export PYTHONPATH=/Mythic:/Mythic/mythic
python3.8 mythic_service.py
@@ -1,410 +0,0 @@
#!/usr/bin/env python3
import aio_pika
import os
import time
import sys
import subprocess
import _thread
import base64
import json
import socket
import asyncio
import pathlib
import traceback
from C2ProfileBase import *
from importlib import import_module, invalidate_caches
from functools import partial
credentials = None
connection_params = None
running = False
process = None
thread = None
hostname = ""
output = ""
exchange = None
container_files_path = None
def deal_with_stdout():
global process
global output
while True:
try:
for line in iter(process.stdout.readline, b""):
output += line.decode("utf-8")
except Exception as e:
print("Exiting thread due to: {}\n".format(str(e)))
sys.stdout.flush()
break
def import_all_c2_functions():
import glob
# Get file paths of all modules.
modules = glob.glob("c2_functions/*.py")
invalidate_caches()
for x in modules:
if not x.endswith("__init__.py") and x[-3:] == ".py":
module = import_module("c2_functions." + pathlib.Path(x).stem, package=None)
for el in dir(module):
if "__" not in el:
globals()[el] = getattr(module, el)
async def send_status(message="", routing_key=""):
global exchange
try:
message_body = aio_pika.Message(message.encode())
await exchange.publish(message_body, routing_key=routing_key)
except Exception as e:
print("Exception in send_status: {}".format(str(e)))
sys.stdout.flush()
async def callback(message: aio_pika.IncomingMessage):
global running
global process
global output
global thread
global hostname
global container_files_path
with message.process():
# messages of the form: c2.modify.PROFILE NAME.command
try:
command = message.routing_key.split(".")[3]
username = message.routing_key.split(".")[4]
server_path = container_files_path / "server"
# command = body.decode('utf-8')
if command == "start":
if not running:
# make sure to start the /Apfell/server in the background
os.chmod(server_path, mode=0o777)
output = ""
process = subprocess.Popen(
str(server_path),
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
cwd=str(container_files_path),
)
thread = _thread.start_new_thread(deal_with_stdout, ())
time.sleep(3)
process.poll()
if process.returncode is not None:
# this means something went wrong and the process is dead
running = False
await send_status(
message="Failed to start\nOutput: {}".format(output),
routing_key="c2.status.{}.stopped.start.{}".format(
hostname, username
),
)
output = ""
else:
running = True
await send_status(
message="Started with pid: {}...\nOutput: {}".format(
str(process.pid), output
),
routing_key="c2.status.{}.running.start.{}".format(
hostname, username
),
)
output = ""
else:
await send_status(
message="Already running...\nOutput: {}".format(output),
routing_key="c2.status.{}.running.start.{}".format(
hostname, username
),
)
output = ""
elif command == "stop":
if running:
try:
process.kill()
process.communicate()
except Exception as e:
pass
try:
thread.exit()
except Exception as e:
pass
running = False
await send_status(
message="Process killed...\nOld Output: {}".format(output),
routing_key="c2.status.{}.stopped.stop.{}".format(
hostname, username
),
)
output = ""
else:
await send_status(
message="Process not running...\nOld Output: {}".format(output),
routing_key="c2.status.{}.stopped.stop.{}".format(
hostname, username
),
)
output = ""
# make sure to stop the /Apfell/server in the background
elif command == "status":
if running:
await send_status(
message="Output: {}".format(output),
routing_key="c2.status.{}.running.status.{}".format(
hostname, username
),
)
output = ""
else:
await send_status(
message="C2 is not running",
routing_key="c2.status.{}.stopped.status.{}".format(
hostname, username
),
)
elif command == "get_config":
try:
path = container_files_path / "config.json"
file_data = open(path, "rb").read()
except Exception as e:
file_data = b"File not found"
encoded_data = json.dumps(
{
"filename": "config.json",
"data": base64.b64encode(file_data).decode("utf-8"),
}
)
await send_status(
message=encoded_data,
routing_key="c2.status.{}.{}.get_config.{}".format(
hostname, "running" if running else "stopped", username
),
)
elif command == "writefile":
try:
message = json.loads(message.body.decode("utf-8"))
file_path = container_files_path / message["file_path"]
file_path = file_path.resolve()
if container_files_path not in file_path.parents:
response = {
"status": "error",
"error": "trying to break out of path",
}
else:
file = open(file_path, "wb")
file.write(base64.b64decode(message["data"]))
file.close()
response = {"status": "success", "file": message["file_path"]}
except Exception as e:
response = {"status": "error", "error": str(e)}
await send_status(
message=json.dumps(response),
routing_key="c2.status.{}.{}.writefile.{}".format(
hostname, "running" if running else "stopped", username
),
)
elif command == "sync_classes":
try:
import_all_c2_functions()
# c2profile = {}
for cls in C2Profile.__subclasses__():
c2profile = cls().to_json()
break
await send_status(
message=json.dumps(c2profile),
routing_key="c2.status.{}.{}.sync_classes.{}".format(
hostname, "running" if running else "stopped", username
),
)
except Exception as e:
await send_status(
message='{"message": "Error while syncing info: {}"}'.format(
str(traceback.format_exc())
),
routing_key="c2.status.{}.{}.sync_classes.{}".format(
hostname, "running" if running else "stopped", username
),
)
else:
print("Unknown command: {}".format(command))
sys.stdout.flush()
except Exception as e:
print("Failed overall message processing: " + str(e))
sys.stdout.flush()
async def sync_classes():
try:
import_all_c2_functions()
c2profile = {}
for cls in C2Profile.__subclasses__():
c2profile = cls().to_json()
break
await send_status(
message=json.dumps(c2profile),
routing_key="c2.status.{}.{}.sync_classes.{}".format(
hostname, "stopped", ""
),
)
except Exception as e:
await send_status(
message='{"message": "Error while syncing info: {}"}'.format(
str(traceback.format_exc())
),
routing_key="c2.status.{}.{}.sync_classes.{}".format(
hostname, "stopped", ""
),
)
async def rabbit_c2_rpc_callback(
exchange: aio_pika.Exchange, message: aio_pika.IncomingMessage
):
with message.process():
request = json.loads(message.body.decode())
if "action" in request:
response = await globals()[request["action"]](request)
response = json.dumps(response.to_json()).encode()
else:
response = json.dumps(
{"status": "error", "error": "Missing action"}
).encode()
try:
await exchange.publish(
aio_pika.Message(body=response, correlation_id=message.correlation_id),
routing_key=message.reply_to,
)
except Exception as e:
print(
"Exception trying to send message back to container for rpc! " + str(e)
)
sys.stdout.flush()
async def connect_and_consume_rpc():
connection = None
global hostname
while connection is None:
try:
connection = await aio_pika.connect_robust(
host="127.0.0.1",
login="mythic_user",
password="mythic_password",
virtualhost="mythic_vhost",
)
channel = await connection.channel()
# get a random queue that only the apfell server will use to listen on to catch all heartbeats
queue = await channel.declare_queue("{}_rpc_queue".format(hostname))
await channel.set_qos(prefetch_count=50)
try:
task = queue.consume(
partial(rabbit_c2_rpc_callback, channel.default_exchange)
)
result = await asyncio.wait_for(task, None)
except Exception as e:
print("Exception in connect_and_consume .consume: {}".format(str(e)))
sys.stdout.flush()
except (ConnectionError, ConnectionRefusedError) as c:
print("Connection to rabbitmq failed, trying again...")
sys.stdout.flush()
except Exception as e:
print("Exception in connect_and_consume_rpc connect: {}".format(str(e)))
# print("Exception in connect_and_consume connect: {}".format(str(e)))
sys.stdout.flush()
await asyncio.sleep(2)
async def mythic_service():
global hostname
global exchange
global container_files_path
connection = None
config_file = open("rabbitmq_config.json", "rb")
main_config = json.loads(config_file.read().decode("utf-8"))
config_file.close()
if main_config["name"] == "hostname":
hostname = socket.gethostname()
else:
hostname = main_config["name"]
container_files_path = pathlib.Path(
os.path.abspath(main_config["container_files_path"])
)
container_files_path = container_files_path / "c2_code"
while connection is None:
try:
connection = await aio_pika.connect_robust(
host=main_config["host"],
login=main_config["username"],
password=main_config["password"],
virtualhost=main_config["virtual_host"],
)
except Exception as e:
await asyncio.sleep(2)
try:
channel = await connection.channel()
exchange = await channel.declare_exchange(
"mythic_traffic", aio_pika.ExchangeType.TOPIC
)
queue = await channel.declare_queue("", exclusive=True)
await queue.bind(
exchange="mythic_traffic", routing_key="c2.modify.{}.#".format(hostname)
)
# just want to handle one message at a time so we can clean up and be ready
await channel.set_qos(prefetch_count=30)
print("Listening for c2.modify.{}.#".format(hostname))
sys.stdout.flush()
task = queue.consume(callback)
await sync_classes()
task4 = asyncio.ensure_future(connect_and_consume_rpc())
result = await asyncio.gather(task, task4)
# send_status(message="", routing_key="c2.status.{}.stopped.stop".format(hostname))
except Exception as e:
print(str(traceback.format_exc()))
sys.stdout.flush()
async def heartbeat_loop():
config_file = open("rabbitmq_config.json", "rb")
main_config = json.loads(config_file.read().decode("utf-8"))
config_file.close()
if main_config["name"] == "hostname":
hostname = socket.gethostname()
else:
hostname = main_config["name"]
while True:
try:
connection = await aio_pika.connect_robust(
host=main_config["host"],
login=main_config["username"],
password=main_config["password"],
virtualhost=main_config["virtual_host"],
)
channel = await connection.channel()
# declare our heartbeat exchange that everybody will publish to, but only the apfell server will are about
exchange = await channel.declare_exchange(
"mythic_traffic", aio_pika.ExchangeType.TOPIC
)
except Exception as e:
print(str(e))
await asyncio.sleep(2)
continue
while True:
try:
# routing key is ignored for fanout, it'll go to anybody that's listening, which will only be the server
await exchange.publish(
aio_pika.Message("heartbeat".encode()),
routing_key="c2.heartbeat.{}".format(hostname),
)
await asyncio.sleep(10)
except Exception as e:
print(str(e))
# if we get an exception here, break out to the bigger loop and try to connect again
break
# start our service
loop = asyncio.get_event_loop()
loop.create_task(mythic_service())
loop.create_task(heartbeat_loop())
loop.run_forever()
@@ -1,8 +0,0 @@
{
"username": "mythic_user",
"password": "mythic_password",
"virtual_host": "mythic_vhost",
"host": "127.0.0.1",
"name": "hostname",
"container_files_path": "/Mythic/"
}
@@ -1 +0,0 @@
From itsafeaturemythic/python38_sanic_c2profile:0.0.1
@@ -1,10 +0,0 @@
{
"bindaddress": "0.0.0.0:8081",
"usessl": false,
"sslkey":"",
"sslcert":"",
"websocketuri": "socket",
"defaultpage": "index.html",
"logfile": "server.log",
"debug": false
}
@@ -1,9 +0,0 @@
<!DOCTYPE>
<html>
<head>
<title>Under Construction</title>
</head>
<body>
<p>This page is under construction. Please come back soon!</p>
</body>
</html>
Binary file not shown.
@@ -1,8 +0,0 @@
To build the sever:
go get github.com/gorilla/websocket
go get github.com/kabukky/httpscerts
go build -tags=websocket main.go
this outputs a binary called "main"
move this to ../server
@@ -1,35 +0,0 @@
package main
import (
"encoding/json"
"io/ioutil"
"log"
"os"
"./pkg/servers"
)
var cf *os.File
func main() {
cf, err := os.Open("config.json")
if err != nil {
log.Println("Error opening config file ", err.Error())
os.Exit(-1)
}
config, _ := ioutil.ReadAll(cf)
c2config := servers.C2Config{}
err = json.Unmarshal(config, &c2config)
if err != nil {
log.Println("Error in unmarshal call for config ", err.Error())
os.Exit(-1)
}
// start the server instance with the config
c2server := servers.NewInstance().(servers.Server)
c2server.Run(c2config)
}
@@ -1,34 +0,0 @@
package servers
// C2Config - struct for server configuration
type C2Config struct {
BindAddress string `json:"bindaddress"`
SocketURI string `json:"websocketuri"`
SSLKey string `json:"sslkey"`
SSLCert string `json:"sslcert"`
UseSSL bool `json:"usessl"`
Defaultpage string `json:"defaultpage"`
Logfile string `json:"logfile"`
Debug bool `json:"debug"`
}
//Server - interface used for all c2 profiles
type Server interface {
ApfellBaseURL() string
SetApfellBaseURL(url string)
PostResponse(taskid string, output []byte) []byte
PostMessage(msg []byte) []byte
GetNextTask(apfellID string) []byte
Run(cf interface{})
}
//Message - struct definition for messages between clients and the server
type Message struct {
Tag string `json:"tag"`
Client bool `json:"client"`
Data string `json:"data"`
}
func NewInstance() interface{} {
return newServer()
}
@@ -1,298 +0,0 @@
// +build websocket
package servers
import (
"bytes"
"crypto/tls"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"strings"
"github.com/gorilla/websocket"
"github.com/kabukky/httpscerts"
)
type WebsocketC2 struct {
BaseURL string
BindAddress string
SSL bool
SocketURI string
Defaultpage string
Logfile string
Debug bool
}
var upgrader = websocket.Upgrader{}
func newServer() Server {
return &WebsocketC2{}
}
func (s *WebsocketC2) SetBindAddress(addr string) {
s.BindAddress = addr
}
//ApfellBaseURL - Returns the base url for apfell
func (s WebsocketC2) ApfellBaseURL() string {
return s.BaseURL
}
//SetApfellBaseURL - Sets the base url for apfell
func (s *WebsocketC2) SetApfellBaseURL(url string) {
s.BaseURL = url
}
//SetSocketURI - Set socket uri
func (s *WebsocketC2) SetSocketURI(uri string) {
s.SocketURI = uri
}
func (s *WebsocketC2) PostMessage(msg []byte) []byte {
return s.htmlPostData("", msg)
}
func (s WebsocketC2) GetNextTask(apfellID string) []byte {
//place holder
//url := fmt.Sprintf("%sapi/v%s/agent_message", s.ApfellBaseURL(), ApiVersion)
return make([]byte, 0)
}
func (s WebsocketC2) PostResponse(taskid string, output []byte) []byte {
//urlEnding := fmt.Sprintf("api/v%s/agent_message", ApiVersion)
return output
}
//postRESTResponse - Wrapper to post task responses through the Apfell rest API
func (s *WebsocketC2) postRESTResponse(urlEnding string, data []byte) []byte {
return make([]byte, 0)
}
//htmlPostData HTTP POST function
func (s *WebsocketC2) htmlPostData(urlEnding string, sendData []byte) []byte {
url := s.ApfellBaseURL()
//log.Println("Sending POST request to url: ", url)
s.Websocketlog(fmt.Sprintln("Sending POST request to: ", url))
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(sendData))
contentLength := len(sendData)
req.ContentLength = int64(contentLength)
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{Transport: tr}
resp, err := client.Do(req)
if err != nil {
s.Websocketlog(fmt.Sprintf("Error sending POST request: %s", err.Error()))
return make([]byte, 0)
}
if resp.StatusCode != 200 {
s.Websocketlog(fmt.Sprintf("Did not receive 200 response code: %d", resp.StatusCode))
return make([]byte, 0)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
s.Websocketlog(fmt.Sprintf("Error reading response body: %s", err.Error()))
return make([]byte, 0)
}
return body
}
//htmlGetData - HTTP GET request for data
func (s *WebsocketC2) htmlGetData(url string) []byte {
//log.Println("Sending HTML GET request to url: ", url)
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{Transport: tr}
var respBody []byte
req, err := http.NewRequest("GET", url, nil)
if err != nil {
s.Websocketlog(fmt.Sprintf("Error creating http request: %s", err.Error()))
return make([]byte, 0)
}
resp, err := client.Do(req)
if err != nil {
s.Websocketlog(fmt.Sprintf("Error completing GET request: %s", err.Error()))
return make([]byte, 0)
}
if resp.StatusCode != 200 {
s.Websocketlog(fmt.Sprintf("Did not receive 200 response code: %d", resp.StatusCode))
return make([]byte, 0)
}
defer resp.Body.Close()
respBody, _ = ioutil.ReadAll(resp.Body)
return respBody
}
func (s *WebsocketC2) SetDebug(debug bool) {
s.Debug = debug
}
//GetDefaultPage - Get the default html page
func (s WebsocketC2) GetDefaultPage() string {
return s.Defaultpage
}
//SetDefaultPage - Set the default html page
func (s *WebsocketC2) SetDefaultPage(newpage string) {
s.Defaultpage = newpage
}
//SocketHandler - Websockets handler
func (s WebsocketC2) SocketHandler(w http.ResponseWriter, r *http.Request) {
//Upgrade the websocket connection
upgrader.CheckOrigin = func(r *http.Request) bool { return true }
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
s.Websocketlog(fmt.Sprintf("Websocket upgrade failed: %s\n", err.Error()))
http.Error(w, "websocket connection failed", http.StatusBadRequest)
return
}
s.Websocketlog("Received new websocket client")
go s.manageClient(conn)
}
func (s *WebsocketC2) manageClient(c *websocket.Conn) {
LOOP:
for {
// Wait for the client to send the initial checkin message
m := Message{}
err := c.ReadJSON(&m)
if err != nil {
s.Websocketlog(fmt.Sprintf("Read error %s. Exiting session", err.Error()))
return
}
var resp []byte
if m.Client {
s.Websocketlog(fmt.Sprintf("Received agent message %+v\n", m))
resp = s.PostMessage([]byte(m.Data))
}
reply := Message{Client: false}
if len(resp) == 0 {
reply.Data = string(make([]byte, 1))
} else {
reply.Data = string(resp)
}
reply.Tag = m.Tag
if err = c.WriteJSON(reply); err != nil {
s.Websocketlog(fmt.Sprintf("Error writing json to client %s", err.Error()))
break LOOP
}
}
c.Close()
}
//ServeDefaultPage - HTTP handler
func (s WebsocketC2) ServeDefaultPage(w http.ResponseWriter, r *http.Request) {
log.Println("Received request: ", r.URL)
log.Println("URI Path ", r.URL.Path)
if (r.URL.Path == "/" || r.URL.Path == "/index.html") && r.Method == "GET" {
// Serve the default page if we receive a GET request at the base URI
http.ServeFile(w, r, s.GetDefaultPage())
}
http.Error(w, "Not Found", http.StatusNotFound)
return
}
//Run - main function for the websocket profile
func (s WebsocketC2) Run(config interface{}) {
cf := config.(C2Config)
s.Debug = cf.Debug
s.SetDefaultPage(cf.Defaultpage)
s.SetApfellBaseURL(os.Getenv("MYTHIC_ADDRESS"))
s.SetBindAddress(cf.BindAddress)
s.SetSocketURI(cf.SocketURI)
// Handle requests to the base uri
http.HandleFunc("/", s.ServeDefaultPage)
// Handle requests to the websockets uri
http.HandleFunc(fmt.Sprintf("/%s", s.SocketURI), s.SocketHandler)
// Setup all of the options according to the configuration
if !strings.Contains(cf.SSLKey, "") && !strings.Contains(cf.SSLCert, "") {
// copy the key and cert to the local directory
keyfile, err := ioutil.ReadFile(cf.SSLKey)
if err != nil {
log.Println("Unable to read key file ", err.Error())
}
err = ioutil.WriteFile("key.pem", keyfile, 0644)
if err != nil {
log.Println("Unable to write key file ", err.Error())
}
certfile, err := ioutil.ReadFile(cf.SSLCert)
if err != nil {
log.Println("Unable to read cert file ", err.Error())
}
err = ioutil.WriteFile("cert.pem", certfile, 0644)
if err != nil {
log.Println("Unable to write cert file ", err.Error())
}
}
if cf.UseSSL {
err := httpscerts.Check("cert.pem", "key.pem")
if err != nil {
s.Websocketlog(fmt.Sprintf("Error for cert.pem or key.pem %s", err.Error()))
err = httpscerts.Generate("cert.pem", "key.pem", cf.BindAddress)
if err != nil {
log.Fatal("Error generating https cert")
os.Exit(1)
}
}
s.Websocketlog(fmt.Sprintf("Starting SSL server at https://%s and wss://%s", cf.BindAddress, cf.BindAddress))
err = http.ListenAndServeTLS(cf.BindAddress, "cert.pem", "key.pem", nil)
if err != nil {
log.Fatal("Failed to start raven server: ", err)
}
} else {
s.Websocketlog(fmt.Sprintf("Starting server at http://%s and ws://%s", cf.BindAddress, cf.BindAddress))
err := http.ListenAndServe(cf.BindAddress, nil)
if err != nil {
log.Fatal("Failed to start raven server: ", err)
}
}
}
//Websocketlog - logging function
func (s WebsocketC2) Websocketlog(msg string) {
if s.Debug {
log.Println(msg)
}
}
@@ -1,130 +0,0 @@
from enum import Enum
from abc import abstractmethod
import json
class ParameterType(Enum):
String = "String"
ChooseOne = "ChooseOne"
Array = "Array"
Date = "Date"
Dictionary = "Dictionary"
class C2ProfileParameter:
def __init__(
self,
name: str,
description: str,
default_value: str = "",
randomize: bool = False,
format_string: str = "",
parameter_type: ParameterType = ParameterType.String,
required: bool = True,
verifier_regex: str = "",
choices: [str] = None,
):
self.name = name
self.description = description
self.randomize = randomize
self.format_string = format_string
self.parameter_type = parameter_type
self.required = required
self.verifier_regex = verifier_regex
self.choices = choices
self.default_value = ""
if self.parameter_type == ParameterType.ChooseOne and choices is not None:
self.default_value = "\n".join(choices)
else:
self.default_value = default_value
def to_json(self):
return {
"name": self.name,
"description": self.description,
"default_value": self.default_value if self.parameter_type not in [ParameterType.Array, ParameterType.Dictionary] else json.dumps(self.default_value),
"randomize": self.randomize,
"format_string": self.format_string,
"required": self.required,
"parameter_type": self.parameter_type.value,
"verifier_regex": self.verifier_regex,
}
class C2Profile:
@property
@abstractmethod
def name(self):
pass
@property
@abstractmethod
def description(self):
pass
@property
@abstractmethod
def author(self):
pass
@property
@abstractmethod
def is_p2p(self):
pass
@property
@abstractmethod
def is_server_routed(self):
pass
@property
@abstractmethod
def mythic_encrypts(self):
pass
@property
@abstractmethod
def parameters(self):
pass
def to_json(self):
return {
"name": self.name,
"description": self.description,
"author": self.author,
"mythic_encrypts": self.mythic_encrypts,
"is_p2p": self.is_p2p,
"is_server_routed": self.is_server_routed,
"params": [x.to_json() for x in self.parameters],
}
class RPCStatus(Enum):
Success = "success"
Error = "error"
class RPCResponse:
def __init__(self, status: RPCStatus = None, response: str = None):
self.status = status
self.response = response
@property
def status(self):
return self._status
@status.setter
def status(self, status):
self._status = status
@property
def response(self):
return self._response
@response.setter
def response(self, response):
self._response = response
def to_json(self):
return {"status": self.status.value, "response": self.response}
@@ -1,99 +0,0 @@
from aio_pika import connect_robust, IncomingMessage, Message
import asyncio
import uuid
import json
from enum import Enum
class MythicStatus(Enum):
Success = "success"
Error = "error"
class RPCResponse:
def __init__(self, resp: dict):
self._raw_resp = resp
if resp["status"] == "success":
self.status = MythicStatus.Success
self.response = resp["response"] if "response" in resp else ""
self.error_message = None
else:
self.status = MythicStatus.Error
self.error_message = resp["error"]
self.response = None
@property
def status(self):
return self._status
@status.setter
def status(self, status):
self._status = status
@property
def error_message(self):
return self._error_message
@error_message.setter
def error_message(self, error_message):
self._error_message = error_message
@property
def response(self):
return self._response
@response.setter
def response(self, response):
self._response = response
class MythicBaseRPC:
def __init__(self):
self.connection = None
self.channel = None
self.callback_queue = None
self.futures = {}
self.loop = asyncio.get_event_loop()
async def connect(self):
config_file = open("/Mythic/mythic/rabbitmq_config.json", "rb")
main_config = json.loads(config_file.read().decode("utf-8"))
config_file.close()
self.connection = await connect_robust(
host=main_config["host"],
login=main_config["username"],
password=main_config["password"],
virtualhost=main_config["virtual_host"],
)
self.channel = await self.connection.channel()
self.callback_queue = await self.channel.declare_queue(exclusive=True)
await self.callback_queue.consume(self.on_response)
return self
def on_response(self, message: IncomingMessage):
future = self.futures.pop(message.correlation_id)
future.set_result(message.body)
async def call(self, n, receiver: str = None) -> RPCResponse:
if self.connection is None:
await self.connect()
correlation_id = str(uuid.uuid4())
future = self.loop.create_future()
self.futures[correlation_id] = future
if receiver is None:
router = "c2rpc_queue"
else:
router = "{}_rpc_queue".format(receiver)
await self.channel.default_exchange.publish(
Message(
json.dumps(n).encode(),
content_type="application/json",
correlation_id=correlation_id,
reply_to=self.callback_queue.name,
),
routing_key=router,
)
return RPCResponse(json.loads(await future))
@@ -1,124 +0,0 @@
from MythicBaseRPC import *
import base64
class MythicRPCResponse(RPCResponse):
def __init__(self, resp: RPCResponse):
super().__init__(resp._raw_resp)
if resp.status == MythicStatus.Success:
self.data = resp.response
else:
self.data = None
@property
def data(self):
return self._data
@data.setter
def data(self, data):
self._data = data
class MythicCallbackRPC(MythicBaseRPC):
# returns dictionary of `{"raw": raw_tasking, "encrypted": base64(uuid+encrypted_tasking)}`
async def get_tasking(
self, uuid: str, tasking_size: int = 1
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "get_tasking",
"uuid": uuid,
"tasking_size": tasking_size,
}
)
return MythicRPCResponse(resp)
async def add_route(
self,
source_uuid: str,
destination_uuid: str,
direction: int = 1,
metadata: str = None,
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "add_route",
"source": source_uuid,
"destination": destination_uuid,
"direction": direction,
"metadata": metadata,
}
)
return MythicRPCResponse(resp)
async def remove_route(
self,
source_uuid: str,
destination_uuid: str,
direction: int = 1,
metadata: str = None,
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "remove_route",
"source": source_uuid,
"destination": destination_uuid,
"direction": direction,
"metadata": metadata,
}
)
return MythicRPCResponse(resp)
async def get_callback_info(self, uuid: str) -> MythicRPCResponse:
resp = await self.call({"action": "get_callback_info", "uuid": uuid})
return MythicRPCResponse(resp)
async def get_encryption_data(self, uuid: str, profile: str) -> MythicRPCResponse:
resp = await self.call(
{
"action": "get_encryption_data",
"uuid": uuid,
"c2_profile": profile,
}
)
return MythicRPCResponse(resp)
async def update_callback_info(self, uuid: str, info: dict) -> MythicRPCResponse:
resp = await self.call(
{"action": "update_callback_info", "uuid": uuid, "data": info}
)
return MythicRPCResponse(resp)
async def add_event_message(
self, message: str, level: str = "info"
) -> MythicRPCResponse:
resp = await self.call(
{"action": "add_event_message", "level": level, "message": message}
)
return MythicRPCResponse(resp)
async def encrypt_bytes(
self, data: bytes, uuid: str, with_uuid: bool = False,
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "encrypt_bytes",
"data": base64.b64encode(data).decode(),
"uuid": uuid,
"with_uuid": with_uuid,
}
)
return MythicRPCResponse(resp)
async def decrypt_bytes(
self, data: bytes, uuid: str, with_uuid: bool = False,
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "decrypt_bytes",
"uuid": uuid,
"data": base64.b64encode(data).decode(),
"with_uuid": with_uuid,
}
)
return MythicRPCResponse(resp)
Whitespace-only changes.
@@ -1,11 +0,0 @@
from C2ProfileBase import *
import MythicCallbackRPC
# request is a dictionary: {"action": func_name, "message": "the input", "task_id": task id num}
# must return an RPCResponse() object and set .status to an instance of RPCStatus and response to str of message
async def test(request):
response = RPCResponse()
response.status = RPCStatus.Success
response.response = "hello"
#resp = await MythicCallbackRPC.MythicCallbackRPC().add_event_message(message="got a POST message")
return response
Whitespace-only changes.
@@ -1,38 +0,0 @@
from C2ProfileBase import *
class Websocket(C2Profile):
name = "leviathan-websocket"
description = "Websocket C2 Server for Leviathan"
author = "@xorrior"
is_p2p = False
is_server_routed = False
mythic_encrypts = True
parameters = [
C2ProfileParameter(
name="callback_host",
description="Callback Host",
default_value="ws://127.0.0.1",
verifier_regex="^(ws|wss)://[a-zA-Z0-9]+",
),
C2ProfileParameter(
name="callback_interval",
description="Callback Interval in seconds",
default_value="10",
verifier_regex="^[0-9]+$",
required=False,
),
C2ProfileParameter(
name="ENDPOINT_REPLACE",
description="Websockets Endpoint",
default_value="socket",
required=False,
),
C2ProfileParameter(
name="callback_port",
description="Callback Port",
default_value="8081",
verifier_regex="^[0-9]+$",
required=False,
),
]
@@ -1,7 +0,0 @@
#!/bin/bash
cd /Mythic/mythic
export PYTHONPATH=/Mythic:/Mythic/mythic
python3.8 mythic_service.py
@@ -1,410 +0,0 @@
#!/usr/bin/env python3
import aio_pika
import os
import time
import sys
import subprocess
import _thread
import base64
import json
import socket
import asyncio
import pathlib
import traceback
from C2ProfileBase import *
from importlib import import_module, invalidate_caches
from functools import partial
credentials = None
connection_params = None
running = False
process = None
thread = None
hostname = ""
output = ""
exchange = None
container_files_path = None
def deal_with_stdout():
global process
global output
while True:
try:
for line in iter(process.stdout.readline, b""):
output += line.decode("utf-8")
except Exception as e:
print("Exiting thread due to: {}\n".format(str(e)))
sys.stdout.flush()
break
def import_all_c2_functions():
import glob
# Get file paths of all modules.
modules = glob.glob("c2_functions/*.py")
invalidate_caches()
for x in modules:
if not x.endswith("__init__.py") and x[-3:] == ".py":
module = import_module("c2_functions." + pathlib.Path(x).stem, package=None)
for el in dir(module):
if "__" not in el:
globals()[el] = getattr(module, el)
async def send_status(message="", routing_key=""):
global exchange
try:
message_body = aio_pika.Message(message.encode())
await exchange.publish(message_body, routing_key=routing_key)
except Exception as e:
print("Exception in send_status: {}".format(str(e)))
sys.stdout.flush()
async def callback(message: aio_pika.IncomingMessage):
global running
global process
global output
global thread
global hostname
global container_files_path
with message.process():
# messages of the form: c2.modify.PROFILE NAME.command
try:
command = message.routing_key.split(".")[3]
username = message.routing_key.split(".")[4]
server_path = container_files_path / "server"
# command = body.decode('utf-8')
if command == "start":
if not running:
# make sure to start the /Apfell/server in the background
os.chmod(server_path, mode=0o777)
output = ""
process = subprocess.Popen(
str(server_path),
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
cwd=str(container_files_path),
)
thread = _thread.start_new_thread(deal_with_stdout, ())
time.sleep(3)
process.poll()
if process.returncode is not None:
# this means something went wrong and the process is dead
running = False
await send_status(
message="Failed to start\nOutput: {}".format(output),
routing_key="c2.status.{}.stopped.start.{}".format(
hostname, username
),
)
output = ""
else:
running = True
await send_status(
message="Started with pid: {}...\nOutput: {}".format(
str(process.pid), output
),
routing_key="c2.status.{}.running.start.{}".format(
hostname, username
),
)
output = ""
else:
await send_status(
message="Already running...\nOutput: {}".format(output),
routing_key="c2.status.{}.running.start.{}".format(
hostname, username
),
)
output = ""
elif command == "stop":
if running:
try:
process.kill()
process.communicate()
except Exception as e:
pass
try:
thread.exit()
except Exception as e:
pass
running = False
await send_status(
message="Process killed...\nOld Output: {}".format(output),
routing_key="c2.status.{}.stopped.stop.{}".format(
hostname, username
),
)
output = ""
else:
await send_status(
message="Process not running...\nOld Output: {}".format(output),
routing_key="c2.status.{}.stopped.stop.{}".format(
hostname, username
),
)
output = ""
# make sure to stop the /Apfell/server in the background
elif command == "status":
if running:
await send_status(
message="Output: {}".format(output),
routing_key="c2.status.{}.running.status.{}".format(
hostname, username
),
)
output = ""
else:
await send_status(
message="C2 is not running",
routing_key="c2.status.{}.stopped.status.{}".format(
hostname, username
),
)
elif command == "get_config":
try:
path = container_files_path / "config.json"
file_data = open(path, "rb").read()
except Exception as e:
file_data = b"File not found"
encoded_data = json.dumps(
{
"filename": "config.json",
"data": base64.b64encode(file_data).decode("utf-8"),
}
)
await send_status(
message=encoded_data,
routing_key="c2.status.{}.{}.get_config.{}".format(
hostname, "running" if running else "stopped", username
),
)
elif command == "writefile":
try:
message = json.loads(message.body.decode("utf-8"))
file_path = container_files_path / message["file_path"]
file_path = file_path.resolve()
if container_files_path not in file_path.parents:
response = {
"status": "error",
"error": "trying to break out of path",
}
else:
file = open(file_path, "wb")
file.write(base64.b64decode(message["data"]))
file.close()
response = {"status": "success", "file": message["file_path"]}
except Exception as e:
response = {"status": "error", "error": str(e)}
await send_status(
message=json.dumps(response),
routing_key="c2.status.{}.{}.writefile.{}".format(
hostname, "running" if running else "stopped", username
),
)
elif command == "sync_classes":
try:
import_all_c2_functions()
# c2profile = {}
for cls in C2Profile.__subclasses__():
c2profile = cls().to_json()
break
await send_status(
message=json.dumps(c2profile),
routing_key="c2.status.{}.{}.sync_classes.{}".format(
hostname, "running" if running else "stopped", username
),
)
except Exception as e:
await send_status(
message='{"message": "Error while syncing info: {}"}'.format(
str(traceback.format_exc())
),
routing_key="c2.status.{}.{}.sync_classes.{}".format(
hostname, "running" if running else "stopped", username
),
)
else:
print("Unknown command: {}".format(command))
sys.stdout.flush()
except Exception as e:
print("Failed overall message processing: " + str(e))
sys.stdout.flush()
async def sync_classes():
try:
import_all_c2_functions()
c2profile = {}
for cls in C2Profile.__subclasses__():
c2profile = cls().to_json()
break
await send_status(
message=json.dumps(c2profile),
routing_key="c2.status.{}.{}.sync_classes.{}".format(
hostname, "stopped", ""
),
)
except Exception as e:
await send_status(
message='{"message": "Error while syncing info: {}"}'.format(
str(traceback.format_exc())
),
routing_key="c2.status.{}.{}.sync_classes.{}".format(
hostname, "stopped", ""
),
)
async def rabbit_c2_rpc_callback(
exchange: aio_pika.Exchange, message: aio_pika.IncomingMessage
):
with message.process():
request = json.loads(message.body.decode())
if "action" in request:
response = await globals()[request["action"]](request)
response = json.dumps(response.to_json()).encode()
else:
response = json.dumps(
{"status": "error", "error": "Missing action"}
).encode()
try:
await exchange.publish(
aio_pika.Message(body=response, correlation_id=message.correlation_id),
routing_key=message.reply_to,
)
except Exception as e:
print(
"Exception trying to send message back to container for rpc! " + str(e)
)
sys.stdout.flush()
async def connect_and_consume_rpc():
connection = None
global hostname
while connection is None:
try:
connection = await aio_pika.connect_robust(
host="127.0.0.1",
login="mythic_user",
password="mythic_password",
virtualhost="mythic_vhost",
)
channel = await connection.channel()
# get a random queue that only the apfell server will use to listen on to catch all heartbeats
queue = await channel.declare_queue("{}_rpc_queue".format(hostname))
await channel.set_qos(prefetch_count=50)
try:
task = queue.consume(
partial(rabbit_c2_rpc_callback, channel.default_exchange)
)
result = await asyncio.wait_for(task, None)
except Exception as e:
print("Exception in connect_and_consume .consume: {}".format(str(e)))
sys.stdout.flush()
except (ConnectionError, ConnectionRefusedError) as c:
print("Connection to rabbitmq failed, trying again...")
sys.stdout.flush()
except Exception as e:
print("Exception in connect_and_consume_rpc connect: {}".format(str(e)))
# print("Exception in connect_and_consume connect: {}".format(str(e)))
sys.stdout.flush()
await asyncio.sleep(2)
async def mythic_service():
global hostname
global exchange
global container_files_path
connection = None
config_file = open("rabbitmq_config.json", "rb")
main_config = json.loads(config_file.read().decode("utf-8"))
config_file.close()
if main_config["name"] == "hostname":
hostname = socket.gethostname()
else:
hostname = main_config["name"]
container_files_path = pathlib.Path(
os.path.abspath(main_config["container_files_path"])
)
container_files_path = container_files_path / "c2_code"
while connection is None:
try:
connection = await aio_pika.connect_robust(
host=main_config["host"],
login=main_config["username"],
password=main_config["password"],
virtualhost=main_config["virtual_host"],
)
except Exception as e:
await asyncio.sleep(2)
try:
channel = await connection.channel()
exchange = await channel.declare_exchange(
"mythic_traffic", aio_pika.ExchangeType.TOPIC
)
queue = await channel.declare_queue("", exclusive=True)
await queue.bind(
exchange="mythic_traffic", routing_key="c2.modify.{}.#".format(hostname)
)
# just want to handle one message at a time so we can clean up and be ready
await channel.set_qos(prefetch_count=30)
print("Listening for c2.modify.{}.#".format(hostname))
sys.stdout.flush()
task = queue.consume(callback)
await sync_classes()
task4 = asyncio.ensure_future(connect_and_consume_rpc())
result = await asyncio.gather(task, task4)
# send_status(message="", routing_key="c2.status.{}.stopped.stop".format(hostname))
except Exception as e:
print(str(traceback.format_exc()))
sys.stdout.flush()
async def heartbeat_loop():
config_file = open("rabbitmq_config.json", "rb")
main_config = json.loads(config_file.read().decode("utf-8"))
config_file.close()
if main_config["name"] == "hostname":
hostname = socket.gethostname()
else:
hostname = main_config["name"]
while True:
try:
connection = await aio_pika.connect_robust(
host=main_config["host"],
login=main_config["username"],
password=main_config["password"],
virtualhost=main_config["virtual_host"],
)
channel = await connection.channel()
# declare our heartbeat exchange that everybody will publish to, but only the apfell server will are about
exchange = await channel.declare_exchange(
"mythic_traffic", aio_pika.ExchangeType.TOPIC
)
except Exception as e:
print(str(e))
await asyncio.sleep(2)
continue
while True:
try:
# routing key is ignored for fanout, it'll go to anybody that's listening, which will only be the server
await exchange.publish(
aio_pika.Message("heartbeat".encode()),
routing_key="c2.heartbeat.{}".format(hostname),
)
await asyncio.sleep(10)
except Exception as e:
print(str(e))
# if we get an exception here, break out to the bigger loop and try to connect again
break
# start our service
loop = asyncio.get_event_loop()
loop.create_task(mythic_service())
loop.create_task(heartbeat_loop())
loop.run_forever()
@@ -1,8 +0,0 @@
{
"username": "mythic_user",
"password": "mythic_password",
"virtual_host": "mythic_vhost",
"host": "127.0.0.1",
"name": "hostname",
"container_files_path": "/Mythic/"
}
-1
View File
@@ -1 +0,0 @@
From itsafeaturemythic/python38_sanic_c2profile:0.0.1
-10
View File
@@ -1,10 +0,0 @@
{
"bindaddress": "0.0.0.0:8081",
"usessl": false,
"sslkey":"",
"sslcert":"",
"websocketuri": "socket",
"defaultpage": "index.html",
"logfile": "server.log",
"debug": false
}
-9
View File
@@ -1,9 +0,0 @@
<!DOCTYPE>
<html>
<head>
<title>Under Construction</title>
</head>
<body>
<p>This page is under construction. Please come back soon!</p>
</body>
</html>
Binary file not shown.
@@ -1,8 +0,0 @@
To build the sever:
go get github.com/gorilla/websocket
go get github.com/kabukky/httpscerts
go build -tags=websocket main.go
this outputs a binary called "main"
move this to ../server
-35
View File
@@ -1,35 +0,0 @@
package main
import (
"encoding/json"
"io/ioutil"
"log"
"os"
"./pkg/servers"
)
var cf *os.File
func main() {
cf, err := os.Open("config.json")
if err != nil {
log.Println("Error opening config file ", err.Error())
os.Exit(-1)
}
config, _ := ioutil.ReadAll(cf)
c2config := servers.C2Config{}
err = json.Unmarshal(config, &c2config)
if err != nil {
log.Println("Error in unmarshal call for config ", err.Error())
os.Exit(-1)
}
// start the server instance with the config
c2server := servers.NewInstance().(servers.Server)
c2server.Run(c2config)
}
@@ -1,34 +0,0 @@
package servers
// C2Config - struct for server configuration
type C2Config struct {
BindAddress string `json:"bindaddress"`
SocketURI string `json:"websocketuri"`
SSLKey string `json:"sslkey"`
SSLCert string `json:"sslcert"`
UseSSL bool `json:"usessl"`
Defaultpage string `json:"defaultpage"`
Logfile string `json:"logfile"`
Debug bool `json:"debug"`
}
//Server - interface used for all c2 profiles
type Server interface {
ApfellBaseURL() string
SetApfellBaseURL(url string)
PostResponse(taskid string, output []byte) []byte
PostMessage(msg []byte) []byte
GetNextTask(apfellID string) []byte
Run(cf interface{})
}
//Message - struct definition for messages between clients and the server
type Message struct {
Tag string `json:"tag"`
Client bool `json:"client"`
Data string `json:"data"`
}
func NewInstance() interface{} {
return newServer()
}
@@ -1,298 +0,0 @@
// +build websocket
package servers
import (
"bytes"
"crypto/tls"
"fmt"
"io/ioutil"
"log"
"net/http"
"os"
"strings"
"github.com/gorilla/websocket"
"github.com/kabukky/httpscerts"
)
type WebsocketC2 struct {
BaseURL string
BindAddress string
SSL bool
SocketURI string
Defaultpage string
Logfile string
Debug bool
}
var upgrader = websocket.Upgrader{}
func newServer() Server {
return &WebsocketC2{}
}
func (s *WebsocketC2) SetBindAddress(addr string) {
s.BindAddress = addr
}
//ApfellBaseURL - Returns the base url for apfell
func (s WebsocketC2) ApfellBaseURL() string {
return s.BaseURL
}
//SetApfellBaseURL - Sets the base url for apfell
func (s *WebsocketC2) SetApfellBaseURL(url string) {
s.BaseURL = url
}
//SetSocketURI - Set socket uri
func (s *WebsocketC2) SetSocketURI(uri string) {
s.SocketURI = uri
}
func (s *WebsocketC2) PostMessage(msg []byte) []byte {
return s.htmlPostData("", msg)
}
func (s WebsocketC2) GetNextTask(apfellID string) []byte {
//place holder
//url := fmt.Sprintf("%sapi/v%s/agent_message", s.ApfellBaseURL(), ApiVersion)
return make([]byte, 0)
}
func (s WebsocketC2) PostResponse(taskid string, output []byte) []byte {
//urlEnding := fmt.Sprintf("api/v%s/agent_message", ApiVersion)
return output
}
//postRESTResponse - Wrapper to post task responses through the Apfell rest API
func (s *WebsocketC2) postRESTResponse(urlEnding string, data []byte) []byte {
return make([]byte, 0)
}
//htmlPostData HTTP POST function
func (s *WebsocketC2) htmlPostData(urlEnding string, sendData []byte) []byte {
url := s.ApfellBaseURL()
//log.Println("Sending POST request to url: ", url)
s.Websocketlog(fmt.Sprintln("Sending POST request to: ", url))
req, _ := http.NewRequest("POST", url, bytes.NewBuffer(sendData))
contentLength := len(sendData)
req.ContentLength = int64(contentLength)
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{Transport: tr}
resp, err := client.Do(req)
if err != nil {
s.Websocketlog(fmt.Sprintf("Error sending POST request: %s", err.Error()))
return make([]byte, 0)
}
if resp.StatusCode != 200 {
s.Websocketlog(fmt.Sprintf("Did not receive 200 response code: %d", resp.StatusCode))
return make([]byte, 0)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
s.Websocketlog(fmt.Sprintf("Error reading response body: %s", err.Error()))
return make([]byte, 0)
}
return body
}
//htmlGetData - HTTP GET request for data
func (s *WebsocketC2) htmlGetData(url string) []byte {
//log.Println("Sending HTML GET request to url: ", url)
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{Transport: tr}
var respBody []byte
req, err := http.NewRequest("GET", url, nil)
if err != nil {
s.Websocketlog(fmt.Sprintf("Error creating http request: %s", err.Error()))
return make([]byte, 0)
}
resp, err := client.Do(req)
if err != nil {
s.Websocketlog(fmt.Sprintf("Error completing GET request: %s", err.Error()))
return make([]byte, 0)
}
if resp.StatusCode != 200 {
s.Websocketlog(fmt.Sprintf("Did not receive 200 response code: %d", resp.StatusCode))
return make([]byte, 0)
}
defer resp.Body.Close()
respBody, _ = ioutil.ReadAll(resp.Body)
return respBody
}
func (s *WebsocketC2) SetDebug(debug bool) {
s.Debug = debug
}
//GetDefaultPage - Get the default html page
func (s WebsocketC2) GetDefaultPage() string {
return s.Defaultpage
}
//SetDefaultPage - Set the default html page
func (s *WebsocketC2) SetDefaultPage(newpage string) {
s.Defaultpage = newpage
}
//SocketHandler - Websockets handler
func (s WebsocketC2) SocketHandler(w http.ResponseWriter, r *http.Request) {
//Upgrade the websocket connection
upgrader.CheckOrigin = func(r *http.Request) bool { return true }
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
s.Websocketlog(fmt.Sprintf("Websocket upgrade failed: %s\n", err.Error()))
http.Error(w, "websocket connection failed", http.StatusBadRequest)
return
}
s.Websocketlog("Received new websocket client")
go s.manageClient(conn)
}
func (s *WebsocketC2) manageClient(c *websocket.Conn) {
LOOP:
for {
// Wait for the client to send the initial checkin message
m := Message{}
err := c.ReadJSON(&m)
if err != nil {
s.Websocketlog(fmt.Sprintf("Read error %s. Exiting session", err.Error()))
return
}
var resp []byte
if m.Client {
s.Websocketlog(fmt.Sprintf("Received agent message %+v\n", m))
resp = s.PostMessage([]byte(m.Data))
}
reply := Message{Client: false}
if len(resp) == 0 {
reply.Data = string(make([]byte, 1))
} else {
reply.Data = string(resp)
}
reply.Tag = m.Tag
if err = c.WriteJSON(reply); err != nil {
s.Websocketlog(fmt.Sprintf("Error writing json to client %s", err.Error()))
break LOOP
}
}
c.Close()
}
//ServeDefaultPage - HTTP handler
func (s WebsocketC2) ServeDefaultPage(w http.ResponseWriter, r *http.Request) {
log.Println("Received request: ", r.URL)
log.Println("URI Path ", r.URL.Path)
if (r.URL.Path == "/" || r.URL.Path == "/index.html") && r.Method == "GET" {
// Serve the default page if we receive a GET request at the base URI
http.ServeFile(w, r, s.GetDefaultPage())
}
http.Error(w, "Not Found", http.StatusNotFound)
return
}
//Run - main function for the websocket profile
func (s WebsocketC2) Run(config interface{}) {
cf := config.(C2Config)
s.Debug = cf.Debug
s.SetDefaultPage(cf.Defaultpage)
s.SetApfellBaseURL(os.Getenv("MYTHIC_ADDRESS"))
s.SetBindAddress(cf.BindAddress)
s.SetSocketURI(cf.SocketURI)
// Handle requests to the base uri
http.HandleFunc("/", s.ServeDefaultPage)
// Handle requests to the websockets uri
http.HandleFunc(fmt.Sprintf("/%s", s.SocketURI), s.SocketHandler)
// Setup all of the options according to the configuration
if !strings.Contains(cf.SSLKey, "") && !strings.Contains(cf.SSLCert, "") {
// copy the key and cert to the local directory
keyfile, err := ioutil.ReadFile(cf.SSLKey)
if err != nil {
log.Println("Unable to read key file ", err.Error())
}
err = ioutil.WriteFile("key.pem", keyfile, 0644)
if err != nil {
log.Println("Unable to write key file ", err.Error())
}
certfile, err := ioutil.ReadFile(cf.SSLCert)
if err != nil {
log.Println("Unable to read cert file ", err.Error())
}
err = ioutil.WriteFile("cert.pem", certfile, 0644)
if err != nil {
log.Println("Unable to write cert file ", err.Error())
}
}
if cf.UseSSL {
err := httpscerts.Check("cert.pem", "key.pem")
if err != nil {
s.Websocketlog(fmt.Sprintf("Error for cert.pem or key.pem %s", err.Error()))
err = httpscerts.Generate("cert.pem", "key.pem", cf.BindAddress)
if err != nil {
log.Fatal("Error generating https cert")
os.Exit(1)
}
}
s.Websocketlog(fmt.Sprintf("Starting SSL server at https://%s and wss://%s", cf.BindAddress, cf.BindAddress))
err = http.ListenAndServeTLS(cf.BindAddress, "cert.pem", "key.pem", nil)
if err != nil {
log.Fatal("Failed to start raven server: ", err)
}
} else {
s.Websocketlog(fmt.Sprintf("Starting server at http://%s and ws://%s", cf.BindAddress, cf.BindAddress))
err := http.ListenAndServe(cf.BindAddress, nil)
if err != nil {
log.Fatal("Failed to start raven server: ", err)
}
}
}
//Websocketlog - logging function
func (s WebsocketC2) Websocketlog(msg string) {
if s.Debug {
log.Println(msg)
}
}
@@ -1,130 +0,0 @@
from enum import Enum
from abc import abstractmethod
import json
class ParameterType(Enum):
String = "String"
ChooseOne = "ChooseOne"
Array = "Array"
Date = "Date"
Dictionary = "Dictionary"
class C2ProfileParameter:
def __init__(
self,
name: str,
description: str,
default_value: str = "",
randomize: bool = False,
format_string: str = "",
parameter_type: ParameterType = ParameterType.String,
required: bool = True,
verifier_regex: str = "",
choices: [str] = None,
):
self.name = name
self.description = description
self.randomize = randomize
self.format_string = format_string
self.parameter_type = parameter_type
self.required = required
self.verifier_regex = verifier_regex
self.choices = choices
self.default_value = ""
if self.parameter_type == ParameterType.ChooseOne and choices is not None:
self.default_value = "\n".join(choices)
else:
self.default_value = default_value
def to_json(self):
return {
"name": self.name,
"description": self.description,
"default_value": self.default_value if self.parameter_type not in [ParameterType.Array, ParameterType.Dictionary] else json.dumps(self.default_value),
"randomize": self.randomize,
"format_string": self.format_string,
"required": self.required,
"parameter_type": self.parameter_type.value,
"verifier_regex": self.verifier_regex,
}
class C2Profile:
@property
@abstractmethod
def name(self):
pass
@property
@abstractmethod
def description(self):
pass
@property
@abstractmethod
def author(self):
pass
@property
@abstractmethod
def is_p2p(self):
pass
@property
@abstractmethod
def is_server_routed(self):
pass
@property
@abstractmethod
def mythic_encrypts(self):
pass
@property
@abstractmethod
def parameters(self):
pass
def to_json(self):
return {
"name": self.name,
"description": self.description,
"author": self.author,
"mythic_encrypts": self.mythic_encrypts,
"is_p2p": self.is_p2p,
"is_server_routed": self.is_server_routed,
"params": [x.to_json() for x in self.parameters],
}
class RPCStatus(Enum):
Success = "success"
Error = "error"
class RPCResponse:
def __init__(self, status: RPCStatus = None, response: str = None):
self.status = status
self.response = response
@property
def status(self):
return self._status
@status.setter
def status(self, status):
self._status = status
@property
def response(self):
return self._response
@response.setter
def response(self, response):
self._response = response
def to_json(self):
return {"status": self.status.value, "response": self.response}
@@ -1,99 +0,0 @@
from aio_pika import connect_robust, IncomingMessage, Message
import asyncio
import uuid
import json
from enum import Enum
class MythicStatus(Enum):
Success = "success"
Error = "error"
class RPCResponse:
def __init__(self, resp: dict):
self._raw_resp = resp
if resp["status"] == "success":
self.status = MythicStatus.Success
self.response = resp["response"] if "response" in resp else ""
self.error_message = None
else:
self.status = MythicStatus.Error
self.error_message = resp["error"]
self.response = None
@property
def status(self):
return self._status
@status.setter
def status(self, status):
self._status = status
@property
def error_message(self):
return self._error_message
@error_message.setter
def error_message(self, error_message):
self._error_message = error_message
@property
def response(self):
return self._response
@response.setter
def response(self, response):
self._response = response
class MythicBaseRPC:
def __init__(self):
self.connection = None
self.channel = None
self.callback_queue = None
self.futures = {}
self.loop = asyncio.get_event_loop()
async def connect(self):
config_file = open("/Mythic/mythic/rabbitmq_config.json", "rb")
main_config = json.loads(config_file.read().decode("utf-8"))
config_file.close()
self.connection = await connect_robust(
host=main_config["host"],
login=main_config["username"],
password=main_config["password"],
virtualhost=main_config["virtual_host"],
)
self.channel = await self.connection.channel()
self.callback_queue = await self.channel.declare_queue(exclusive=True)
await self.callback_queue.consume(self.on_response)
return self
def on_response(self, message: IncomingMessage):
future = self.futures.pop(message.correlation_id)
future.set_result(message.body)
async def call(self, n, receiver: str = None) -> RPCResponse:
if self.connection is None:
await self.connect()
correlation_id = str(uuid.uuid4())
future = self.loop.create_future()
self.futures[correlation_id] = future
if receiver is None:
router = "c2rpc_queue"
else:
router = "{}_rpc_queue".format(receiver)
await self.channel.default_exchange.publish(
Message(
json.dumps(n).encode(),
content_type="application/json",
correlation_id=correlation_id,
reply_to=self.callback_queue.name,
),
routing_key=router,
)
return RPCResponse(json.loads(await future))
@@ -1,124 +0,0 @@
from MythicBaseRPC import *
import base64
class MythicRPCResponse(RPCResponse):
def __init__(self, resp: RPCResponse):
super().__init__(resp._raw_resp)
if resp.status == MythicStatus.Success:
self.data = resp.response
else:
self.data = None
@property
def data(self):
return self._data
@data.setter
def data(self, data):
self._data = data
class MythicCallbackRPC(MythicBaseRPC):
# returns dictionary of `{"raw": raw_tasking, "encrypted": base64(uuid+encrypted_tasking)}`
async def get_tasking(
self, uuid: str, tasking_size: int = 1
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "get_tasking",
"uuid": uuid,
"tasking_size": tasking_size,
}
)
return MythicRPCResponse(resp)
async def add_route(
self,
source_uuid: str,
destination_uuid: str,
direction: int = 1,
metadata: str = None,
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "add_route",
"source": source_uuid,
"destination": destination_uuid,
"direction": direction,
"metadata": metadata,
}
)
return MythicRPCResponse(resp)
async def remove_route(
self,
source_uuid: str,
destination_uuid: str,
direction: int = 1,
metadata: str = None,
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "remove_route",
"source": source_uuid,
"destination": destination_uuid,
"direction": direction,
"metadata": metadata,
}
)
return MythicRPCResponse(resp)
async def get_callback_info(self, uuid: str) -> MythicRPCResponse:
resp = await self.call({"action": "get_callback_info", "uuid": uuid})
return MythicRPCResponse(resp)
async def get_encryption_data(self, uuid: str, profile: str) -> MythicRPCResponse:
resp = await self.call(
{
"action": "get_encryption_data",
"uuid": uuid,
"c2_profile": profile,
}
)
return MythicRPCResponse(resp)
async def update_callback_info(self, uuid: str, info: dict) -> MythicRPCResponse:
resp = await self.call(
{"action": "update_callback_info", "uuid": uuid, "data": info}
)
return MythicRPCResponse(resp)
async def add_event_message(
self, message: str, level: str = "info"
) -> MythicRPCResponse:
resp = await self.call(
{"action": "add_event_message", "level": level, "message": message}
)
return MythicRPCResponse(resp)
async def encrypt_bytes(
self, data: bytes, uuid: str, with_uuid: bool = False,
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "encrypt_bytes",
"data": base64.b64encode(data).decode(),
"uuid": uuid,
"with_uuid": with_uuid,
}
)
return MythicRPCResponse(resp)
async def decrypt_bytes(
self, data: bytes, uuid: str, with_uuid: bool = False,
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "decrypt_bytes",
"uuid": uuid,
"data": base64.b64encode(data).decode(),
"with_uuid": with_uuid,
}
)
return MythicRPCResponse(resp)
Whitespace-only changes.
@@ -1,11 +0,0 @@
from C2ProfileBase import *
import MythicCallbackRPC
# request is a dictionary: {"action": func_name, "message": "the input", "task_id": task id num}
# must return an RPCResponse() object and set .status to an instance of RPCStatus and response to str of message
async def test(request):
response = RPCResponse()
response.status = RPCStatus.Success
response.response = "hello"
#resp = await MythicCallbackRPC.MythicCallbackRPC().add_event_message(message="got a POST message")
return response
Whitespace-only changes.
@@ -1,70 +0,0 @@
from C2ProfileBase import *
class Websocket(C2Profile):
name = "websocket"
description = "Websocket C2 Server for poseidon"
author = "@xorrior"
is_p2p = False
is_server_routed = False
mythic_encrypts = True
parameters = [
C2ProfileParameter(
name="callback_host",
description="Callback Host",
default_value="ws://127.0.0.1",
verifier_regex="^(ws|wss)://[a-zA-Z0-9]+",
),
C2ProfileParameter(
name="USER_AGENT",
description="User Agent",
default_value="Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko",
required=False,
),
C2ProfileParameter(
name="AESPSK",
description="Base64 of a 32B AES Key",
default_value="",
required=False,
),
C2ProfileParameter(
name="callback_interval",
description="Callback Interval in seconds",
default_value="10",
verifier_regex="^[0-9]+$",
required=False,
),
C2ProfileParameter(
name="encrypted_exchange_check",
description="Perform Key Exchange",
choices=["T", "F"],
parameter_type=ParameterType.ChooseOne,
required=False,
),
C2ProfileParameter(
name="domain_front",
description="Host header value for domain fronting",
default_value="",
required=False,
),
C2ProfileParameter(
name="ENDPOINT_REPLACE",
description="Websockets Endpoint",
default_value="socket",
required=False,
),
C2ProfileParameter(
name="callback_jitter",
description="Callback Jitter in percent",
default_value="37",
verifier_regex="^[0-9]+$",
required=False,
),
C2ProfileParameter(
name="callback_port",
description="Callback Port",
default_value="8081",
verifier_regex="^[0-9]+$",
required=False,
),
]
@@ -1,7 +0,0 @@
#!/bin/bash
cd /Mythic/mythic
export PYTHONPATH=/Mythic:/Mythic/mythic
python3.8 mythic_service.py
@@ -1,410 +0,0 @@
#!/usr/bin/env python3
import aio_pika
import os
import time
import sys
import subprocess
import _thread
import base64
import json
import socket
import asyncio
import pathlib
import traceback
from C2ProfileBase import *
from importlib import import_module, invalidate_caches
from functools import partial
credentials = None
connection_params = None
running = False
process = None
thread = None
hostname = ""
output = ""
exchange = None
container_files_path = None
def deal_with_stdout():
global process
global output
while True:
try:
for line in iter(process.stdout.readline, b""):
output += line.decode("utf-8")
except Exception as e:
print("Exiting thread due to: {}\n".format(str(e)))
sys.stdout.flush()
break
def import_all_c2_functions():
import glob
# Get file paths of all modules.
modules = glob.glob("c2_functions/*.py")
invalidate_caches()
for x in modules:
if not x.endswith("__init__.py") and x[-3:] == ".py":
module = import_module("c2_functions." + pathlib.Path(x).stem, package=None)
for el in dir(module):
if "__" not in el:
globals()[el] = getattr(module, el)
async def send_status(message="", routing_key=""):
global exchange
try:
message_body = aio_pika.Message(message.encode())
await exchange.publish(message_body, routing_key=routing_key)
except Exception as e:
print("Exception in send_status: {}".format(str(e)))
sys.stdout.flush()
async def callback(message: aio_pika.IncomingMessage):
global running
global process
global output
global thread
global hostname
global container_files_path
with message.process():
# messages of the form: c2.modify.PROFILE NAME.command
try:
command = message.routing_key.split(".")[3]
username = message.routing_key.split(".")[4]
server_path = container_files_path / "server"
# command = body.decode('utf-8')
if command == "start":
if not running:
# make sure to start the /Apfell/server in the background
os.chmod(server_path, mode=0o777)
output = ""
process = subprocess.Popen(
str(server_path),
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
cwd=str(container_files_path),
)
thread = _thread.start_new_thread(deal_with_stdout, ())
time.sleep(3)
process.poll()
if process.returncode is not None:
# this means something went wrong and the process is dead
running = False
await send_status(
message="Failed to start\nOutput: {}".format(output),
routing_key="c2.status.{}.stopped.start.{}".format(
hostname, username
),
)
output = ""
else:
running = True
await send_status(
message="Started with pid: {}...\nOutput: {}".format(
str(process.pid), output
),
routing_key="c2.status.{}.running.start.{}".format(
hostname, username
),
)
output = ""
else:
await send_status(
message="Already running...\nOutput: {}".format(output),
routing_key="c2.status.{}.running.start.{}".format(
hostname, username
),
)
output = ""
elif command == "stop":
if running:
try:
process.kill()
process.communicate()
except Exception as e:
pass
try:
thread.exit()
except Exception as e:
pass
running = False
await send_status(
message="Process killed...\nOld Output: {}".format(output),
routing_key="c2.status.{}.stopped.stop.{}".format(
hostname, username
),
)
output = ""
else:
await send_status(
message="Process not running...\nOld Output: {}".format(output),
routing_key="c2.status.{}.stopped.stop.{}".format(
hostname, username
),
)
output = ""
# make sure to stop the /Apfell/server in the background
elif command == "status":
if running:
await send_status(
message="Output: {}".format(output),
routing_key="c2.status.{}.running.status.{}".format(
hostname, username
),
)
output = ""
else:
await send_status(
message="C2 is not running",
routing_key="c2.status.{}.stopped.status.{}".format(
hostname, username
),
)
elif command == "get_config":
try:
path = container_files_path / "config.json"
file_data = open(path, "rb").read()
except Exception as e:
file_data = b"File not found"
encoded_data = json.dumps(
{
"filename": "config.json",
"data": base64.b64encode(file_data).decode("utf-8"),
}
)
await send_status(
message=encoded_data,
routing_key="c2.status.{}.{}.get_config.{}".format(
hostname, "running" if running else "stopped", username
),
)
elif command == "writefile":
try:
message = json.loads(message.body.decode("utf-8"))
file_path = container_files_path / message["file_path"]
file_path = file_path.resolve()
if container_files_path not in file_path.parents:
response = {
"status": "error",
"error": "trying to break out of path",
}
else:
file = open(file_path, "wb")
file.write(base64.b64decode(message["data"]))
file.close()
response = {"status": "success", "file": message["file_path"]}
except Exception as e:
response = {"status": "error", "error": str(e)}
await send_status(
message=json.dumps(response),
routing_key="c2.status.{}.{}.writefile.{}".format(
hostname, "running" if running else "stopped", username
),
)
elif command == "sync_classes":
try:
import_all_c2_functions()
# c2profile = {}
for cls in C2Profile.__subclasses__():
c2profile = cls().to_json()
break
await send_status(
message=json.dumps(c2profile),
routing_key="c2.status.{}.{}.sync_classes.{}".format(
hostname, "running" if running else "stopped", username
),
)
except Exception as e:
await send_status(
message='{"message": "Error while syncing info: {}"}'.format(
str(traceback.format_exc())
),
routing_key="c2.status.{}.{}.sync_classes.{}".format(
hostname, "running" if running else "stopped", username
),
)
else:
print("Unknown command: {}".format(command))
sys.stdout.flush()
except Exception as e:
print("Failed overall message processing: " + str(e))
sys.stdout.flush()
async def sync_classes():
try:
import_all_c2_functions()
c2profile = {}
for cls in C2Profile.__subclasses__():
c2profile = cls().to_json()
break
await send_status(
message=json.dumps(c2profile),
routing_key="c2.status.{}.{}.sync_classes.{}".format(
hostname, "stopped", ""
),
)
except Exception as e:
await send_status(
message='{"message": "Error while syncing info: {}"}'.format(
str(traceback.format_exc())
),
routing_key="c2.status.{}.{}.sync_classes.{}".format(
hostname, "stopped", ""
),
)
async def rabbit_c2_rpc_callback(
exchange: aio_pika.Exchange, message: aio_pika.IncomingMessage
):
with message.process():
request = json.loads(message.body.decode())
if "action" in request:
response = await globals()[request["action"]](request)
response = json.dumps(response.to_json()).encode()
else:
response = json.dumps(
{"status": "error", "error": "Missing action"}
).encode()
try:
await exchange.publish(
aio_pika.Message(body=response, correlation_id=message.correlation_id),
routing_key=message.reply_to,
)
except Exception as e:
print(
"Exception trying to send message back to container for rpc! " + str(e)
)
sys.stdout.flush()
async def connect_and_consume_rpc():
connection = None
global hostname
while connection is None:
try:
connection = await aio_pika.connect_robust(
host="127.0.0.1",
login="mythic_user",
password="mythic_password",
virtualhost="mythic_vhost",
)
channel = await connection.channel()
# get a random queue that only the apfell server will use to listen on to catch all heartbeats
queue = await channel.declare_queue("{}_rpc_queue".format(hostname))
await channel.set_qos(prefetch_count=50)
try:
task = queue.consume(
partial(rabbit_c2_rpc_callback, channel.default_exchange)
)
result = await asyncio.wait_for(task, None)
except Exception as e:
print("Exception in connect_and_consume .consume: {}".format(str(e)))
sys.stdout.flush()
except (ConnectionError, ConnectionRefusedError) as c:
print("Connection to rabbitmq failed, trying again...")
sys.stdout.flush()
except Exception as e:
print("Exception in connect_and_consume_rpc connect: {}".format(str(e)))
# print("Exception in connect_and_consume connect: {}".format(str(e)))
sys.stdout.flush()
await asyncio.sleep(2)
async def mythic_service():
global hostname
global exchange
global container_files_path
connection = None
config_file = open("rabbitmq_config.json", "rb")
main_config = json.loads(config_file.read().decode("utf-8"))
config_file.close()
if main_config["name"] == "hostname":
hostname = socket.gethostname()
else:
hostname = main_config["name"]
container_files_path = pathlib.Path(
os.path.abspath(main_config["container_files_path"])
)
container_files_path = container_files_path / "c2_code"
while connection is None:
try:
connection = await aio_pika.connect_robust(
host=main_config["host"],
login=main_config["username"],
password=main_config["password"],
virtualhost=main_config["virtual_host"],
)
except Exception as e:
await asyncio.sleep(2)
try:
channel = await connection.channel()
exchange = await channel.declare_exchange(
"mythic_traffic", aio_pika.ExchangeType.TOPIC
)
queue = await channel.declare_queue("", exclusive=True)
await queue.bind(
exchange="mythic_traffic", routing_key="c2.modify.{}.#".format(hostname)
)
# just want to handle one message at a time so we can clean up and be ready
await channel.set_qos(prefetch_count=30)
print("Listening for c2.modify.{}.#".format(hostname))
sys.stdout.flush()
task = queue.consume(callback)
await sync_classes()
task4 = asyncio.ensure_future(connect_and_consume_rpc())
result = await asyncio.gather(task, task4)
# send_status(message="", routing_key="c2.status.{}.stopped.stop".format(hostname))
except Exception as e:
print(str(traceback.format_exc()))
sys.stdout.flush()
async def heartbeat_loop():
config_file = open("rabbitmq_config.json", "rb")
main_config = json.loads(config_file.read().decode("utf-8"))
config_file.close()
if main_config["name"] == "hostname":
hostname = socket.gethostname()
else:
hostname = main_config["name"]
while True:
try:
connection = await aio_pika.connect_robust(
host=main_config["host"],
login=main_config["username"],
password=main_config["password"],
virtualhost=main_config["virtual_host"],
)
channel = await connection.channel()
# declare our heartbeat exchange that everybody will publish to, but only the apfell server will are about
exchange = await channel.declare_exchange(
"mythic_traffic", aio_pika.ExchangeType.TOPIC
)
except Exception as e:
print(str(e))
await asyncio.sleep(2)
continue
while True:
try:
# routing key is ignored for fanout, it'll go to anybody that's listening, which will only be the server
await exchange.publish(
aio_pika.Message("heartbeat".encode()),
routing_key="c2.heartbeat.{}".format(hostname),
)
await asyncio.sleep(10)
except Exception as e:
print(str(e))
# if we get an exception here, break out to the bigger loop and try to connect again
break
# start our service
loop = asyncio.get_event_loop()
loop.create_task(mythic_service())
loop.create_task(heartbeat_loop())
loop.run_forever()
@@ -1,8 +0,0 @@
{
"username": "mythic_user",
"password": "mythic_password",
"virtual_host": "mythic_vhost",
"host": "127.0.0.1",
"name": "hostname",
"container_files_path": "/Mythic/"
}
+2274
View File
File diff suppressed because it is too large. Load diff
@@ -1,9 +0,0 @@
From python:3.6-jessie
RUN pip install aio_pika
RUN mkdir /Mythic_service 2>/dev/null
COPY ["c2_service.sh", "/Mythic_service/c2_service.sh"]
RUN chmod +x /Mythic_service/c2_service.sh
WORKDIR /Mythic_service/
ENTRYPOINT ["/Mythic_service/c2_service.sh"]
@@ -1,7 +0,0 @@
#!/bin/bash
cd /Mythic/mythic
export PYTHONPATH=/Mythic:/Mythic/mythic
python3.8 mythic_service.py
@@ -1,4 +0,0 @@
echo "Pruning old images..."
docker image prune -f
echo "Building golden python3.8 sanic image..."
docker build -f "python38_sanic_dockerfile" --rm -t "python38_sanic_c2profile" .
@@ -1,6 +0,0 @@
From python:3.8-buster
RUN pip install aio_pika sanic requests
ENV PYTHONWARNINGS="ignore:Unverified HTTPS request"
ENTRYPOINT ["/Mythic/mythic/c2_service.sh"]
@@ -1,35 +0,0 @@
#!/bin/bash
# This script needs to be executed just once
if [ -f /$0.completed ] ; then
echo "$0 `date` /$0.completed found, skipping run"
exit 0
fi
# Wait for RabbitMQ startup
for (( ; ; )) ; do
sleep 2
rabbitmqctl -q node_health_check > /dev/null 2>&1
if [ $? -eq 0 ] ; then
echo "$0 `date` rabbitmq is now running"
break
else
echo "$0 `date` waiting for rabbitmq startup"
fi
done
# Execute RabbitMQ config commands here
# Create user
rabbitmqctl add_user mythic_user mythic_password
rabbitmqctl add_vhost mythic_vhost
rabbitmqctl set_user_tags mythic_user administrator
rabbitmqctl set_permissions -p mythic_vhost mythic_user ".*" ".*" ".*"
echo "$0 `date` user mythic_user created"
# Create queue
#rabbitmqadmin declare queue name=QUEUE durable=true
#echo "$0 `date` queues created"
# Create mark so script is not ran again
touch /$0.completed
@@ -1,12 +0,0 @@
echo "Pruning old images..."
docker image prune -f
echo "Building golden postgres image..."
docker build -f "mythic_postgres" --rm -t "mythic_postgres" .
docker image prune -f
echo "Building golden rabbitmq image..."
docker build -f "mythic_rabbitmq" --rm -t "mythic_rabbitmq" .
docker image prune -f
echo "Building golden server image..."
docker build -f "mythic_server" --rm -t "mythic_server" .
@@ -1,8 +0,0 @@
#!/bin/bash
# Launch config script in background
# Note there is no RabbitMQ Docker image support for executing commands after server (PID 1) is running (something like "ADD schema.sql /docker-entrypoint-initdb.d" in MySql image), so we are using this trick
/config_rabbit.sh &
# Launch
/docker-entrypoint.sh rabbitmq-server
@@ -1,6 +0,0 @@
From postgres:9.4
COPY postgres.conf /etc/postgresql/postgresql.conf
ENV config_file=/etc/postgresql/postgresql.conf
ENV POSTGRES_USER 'mythic_user'
ENV POSTGRES_PASSWORD 'super_secret_mythic_user_password'
ENV POSTGRES_DB 'mythic_db'
@@ -1,7 +0,0 @@
FROM rabbitmq:3.7.6-management
ADD init.sh /
ADD config_rabbit.sh /
RUN chmod +x /init.sh /config_rabbit.sh
ENTRYPOINT ["/init.sh"]
@@ -1,5 +0,0 @@
From python:3.8-buster
RUN mkdir /Mythic
WORKDIR /Mythic
COPY ["requirements.txt", "/Mythic/requirements.txt"]
RUN pip install -r /Mythic/requirements.txt
@@ -1,21 +0,0 @@
sanic
psycopg2-binary
peewee-async
aiopg
peewee
jinja2
uvloop==0.14.0.rc1
git+https://github.com/mikekeda/sanic-wtf
pycryptodome
wtforms
anytree
websockets
sanic-jwt
fpdf
aio-pika
requests
dijkstar
exrex
treelib
shortuuid
ujson
@@ -1,38 +0,0 @@
#!/bin/bash
#
# Contains the Go tool-chain pure-Go bootstrapper, that as of Go 1.5, initiates
# not only a few pre-built Go cross compilers, but rather bootstraps all of the
# supported platforms from the origin Linux amd64 distribution.
#
# Usage: bootstrap_pure.sh
#
# Environment variables for remote bootstrapping:
# FETCH - Remote file fetcher and checksum verifier (injected by image)
# ROOT_DIST - 64 bit Linux Go binary distribution package
# ROOT_DIST_SHA - 64 bit Linux Go distribution package checksum
#
# Environment variables for local bootstrapping:
# GOROOT - Path to the lready installed Go runtime
set -e
# Download, verify and install the root distribution if pulled remotely
if [ "$GOROOT" == "" ]; then
$FETCH $ROOT_DIST $ROOT_DIST_SHA
tar -C /usr/local -xzf `basename $ROOT_DIST`
rm -f `basename $ROOT_DIST`
export GOROOT=/usr/local/go
fi
export GOROOT_BOOTSTRAP=$GOROOT
echo "Bootstrapping linux/arm64..."
GOOS=linux GOARCH=arm64 CGO_ENABLED=1 CC=aarch64-linux-gnu-gcc-5 go install std
echo "Bootstrapping darwin/amd64..."
GOOS=darwin GOARCH=amd64 CGO_ENABLED=1 CC=o64-clang go install std
# Install xgo within the container to enable internal cross compilation
echo "Installing xgo-in-xgo..."
go get -u github.com/karalabe/xgo
ln -s /go/bin/xgo /usr/bin/xgo
@@ -1,126 +0,0 @@
#!/bin/bash
#
# Contains the main cross compiler, that individually sets up each target build
# platform, compiles all the C dependencies, then build the requested executable
# itself.
#
# Usage: build.sh <import path>
#
# Needed environment variables:
# REPO_REMOTE - Optional VCS remote if not the primary repository is needed
# REPO_BRANCH - Optional VCS branch to use, if not the master branch
# DEPS - Optional list of C dependency packages to build
# ARGS - Optional arguments to pass to C dependency configure scripts
# PACK - Optional sub-package, if not the import path is being built
# OUT - Optional output prefix to override the package name
# FLAG_V - Optional verbosity flag to set on the Go builder
# FLAG_X - Optional flag to print the build progress commands
# FLAG_RACE - Optional race flag to set on the Go builder
# FLAG_TAGS - Optional tag flag to set on the Go builder
# FLAG_LDFLAGS - Optional ldflags flag to set on the Go builder
# FLAG_BUILDMODE - Optional buildmode flag to set on the Go builder
# TARGETS - Comma separated list of build targets to compile for
# GO_VERSION - Bootstrapped version of Go to disable uncupported targets
# EXT_GOPATH - GOPATH elements mounted from the host filesystem
# Define a function that figures out the binary extension
function extension {
if [ "$FLAG_BUILDMODE" == "archive" ] || [ "$FLAG_BUILDMODE" == "c-archive" ]; then
if [ "$1" == "windows" ]; then
echo ".lib"
else
echo ".a"
fi
elif [ "$FLAG_BUILDMODE" == "shared" ] || [ "$FLAG_BUILDMODE" == "c-shared" ]; then
if [ "$1" == "windows" ]; then
echo ".dll"
elif [ "$1" == "darwin" ] || [ "$1" == "ios" ]; then
echo ".dylib"
else
echo ".so"
fi
else
if [ "$1" == "windows" ]; then
echo ".exe"
fi
fi
}
# Configure some global build parameters
NAME=`basename $1/$PACK`
if [ "$OUT" != "" ]; then
NAME=$OUT
fi
if [ "$FLAG_V" == "true" ]; then V=-v; fi
if [ "$FLAG_X" == "true" ]; then X=-x; fi
if [ "$FLAG_RACE" == "true" ]; then R=-race; fi
if [ "$FLAG_TAGS" != "" ]; then T=(--tags "$FLAG_TAGS"); fi
if [ "$FLAG_LDFLAGS" != "" ]; then LD="$FLAG_LDFLAGS"; fi
if [ "$FLAG_BUILDMODE" != "" ] && [ "$FLAG_BUILDMODE" != "default" ]; then BM="--buildmode=$FLAG_BUILDMODE"; fi
# If no build targets were specified, inject a catch all wildcard
if [ "$TARGETS" == "" ]; then
TARGETS="./."
fi
# Build for each requested platform individually
for TARGET in $TARGETS; do
# Split the target into platform and architecture
XGOOS=`echo $TARGET | cut -d '/' -f 1`
XGOARCH=`echo $TARGET | cut -d '/' -f 2`
# Check and build for Linux targets
if ([ $XGOOS == "." ] || [ $XGOOS == "linux" ]) && ([ $XGOARCH == "." ] || [ $XGOARCH == "amd64" ]); then
echo "Compiling for linux/amd64..."
#HOST=x86_64-linux PREFIX=/usr/local $BUILD_DEPS /deps ${DEPS_ARGS[@]}
#GOOS=linux GOARCH=amd64 CGO_ENABLED=1 go get $V $X "${T[@]}" --ldflags="$V $LD" -d ./$PACK
GOOS=linux GOARCH=amd64 CGO_ENABLED=1 go build $V $X "${T[@]}" --ldflags="$V $LD" $R $BM -o "/build/$NAME-linux-amd64$R`extension linux`" ./$PACK
fi
# Check and build for OSX targets
if [ $XGOOS == "." ] || [[ $XGOOS == darwin* ]]; then
# Split the platform version and configure the deployment target
PLATFORM=`echo $XGOOS | cut -d '-' -f 2`
if [ "$PLATFORM" == "" ] || [ "$PLATFORM" == "." ] || [ "$PLATFORM" == "darwin" ]; then
PLATFORM=10.06 # OS X Snow Leopard
fi
export MACOSX_DEPLOYMENT_TARGET=$PLATFORM
# Strip symbol table below Go 1.6 to prevent DWARF issues
LDSTRIP=""
if [ "$GO_VERSION" -lt 160 ]; then
LDSTRIP="-s"
fi
# Build the requested darwin binaries
if [ $XGOARCH == "." ] || [ $XGOARCH == "amd64" ]; then
echo "Compiling for darwin-$PLATFORM/amd64..."
#CC=o64-clang CXX=o64-clang++ HOST=x86_64-apple-darwin15 PREFIX=/usr/local $BUILD_DEPS /deps ${DEPS_ARGS[@]}
#CC=o64-clang CXX=o64-clang++ GOOS=darwin GOARCH=amd64 CGO_ENABLED=1 go get $V $X "${T[@]}" --ldflags="$LDSTRIP $V $LD" -d ./$PACK
CC=o64-clang CXX=o64-clang++ GOOS=darwin GOARCH=amd64 CGO_ENABLED=1 go build $V $X "${T[@]}" --ldflags="$LDSTRIP $V $LD" $R $BM -o "/build/$NAME-darwin-$PLATFORM-amd64$R`extension darwin`" ./$PACK
fi
# Remove any automatically injected deployment target vars
unset MACOSX_DEPLOYMENT_TARGET
fi
done
# Clean up any leftovers for subsequent build invocations
#echo "Cleaning up build environment..."
#rm -rf /deps
#for dir in `ls /usr/local`; do
# keep=0
# Check against original folder contents
# for old in $USR_LOCAL_CONTENTS; do
# if [ "$old" == "$dir" ]; then
# keep=1
# fi
# done
# Delete anything freshly generated
# if [ "$keep" == "0" ]; then
# rm -rf "/usr/local/$dir"
# fi
#done
@@ -1,16 +0,0 @@
echo "Pruning old images..."
docker image prune -f
echo "Building golden csharp image..."
docker build -f "csharp_dockerfile" --rm -t "csharp_payload" .
docker image prune -f
echo "Building golden python3.8 image..."
docker build -f "python38_dockerfile" --rm -t "python38_payload" .
docker image prune -f
echo "Building golden xgo image..."
docker build -f "xgolang_dockerfile" --rm -t "xgolang_payload" .
docker image prune -f
echo "Building golden leviathan image..."
docker build -f "leviathan_dockerfile" --rm -t "leviathan_payload" .
@@ -1,19 +0,0 @@
from mono:latest
RUN apt-get update
RUN apt-get install software-properties-common apt-utils make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev libffi-dev liblzma-dev -y
RUN apt-get update
RUN wget https://www.python.org/ftp/python/3.8.6/Python-3.8.6.tgz
RUN tar xvf Python-3.8.6.tgz
RUN Python-3.8.6/configure --with-ensurepip=install
RUN make -j8
RUN make altinstall
RUN python3.8 -m pip install aio_pika
RUN mkdir -p "/Windows/assembly/GAC_MSIL/System.Management.Automation/1.0.0.0__31bf3856ad364e35"
COPY ["System.Management.Automation.dll", "/Windows/assembly/GAC_MSIL/System.Management.Automation/1.0.0.0__31bf3856ad364e35/System.Management.Automation.dll"]
RUN mkdir -p "/Windows/Microsoft.NET/assembly/GAC_MSIL/System.Management.Automation/v4.0_3.0.0.0__31bf3856ad364e35"
COPY ["System.Management.Automation.dll-v4", "/Windows/Microsoft.NET/assembly/GAC_MSIL/System.Management.Automation/v4.0_3.0.0.0__31bf3856ad364e35/System.Management.Automation.dll"]
ENTRYPOINT ["/Mythic/mythic/payload_service.sh"]
@@ -1,27 +0,0 @@
#!/bin/bash
#
# Contains a simple fetcher to download a file from a remote URL and verify its
# SHA1 or SHA256 checksum (selected based on provided length).
#
# Usage: fetch.sh <remote URL> <SHA1/SHA256 checksum>
set -e
# Skip the download if no operands specified
if [ "$1" == "" -o "$2" == "" ]; then
echo "Fetch operands missing, skipping..."
exit
fi
# Pull the file from the remote URL
file=`basename $1`
echo "Downloading $1..."
wget -q $1
# Generate a desired checksum report and check against it
echo "$2 $file" > $file.sum
if [ "${#2}" == "40" ]; then
sha1sum -c $file.sum
else
sha256sum -c $file.sum
fi
rm $file.sum
@@ -1,10 +0,0 @@
From python:3.8-buster
RUN pip install aio_pika
RUN apt-get update
RUN apt-get install software-properties-common apt-utils -y
RUN apt-get -y install git
RUN git clone https://github.com/xorrior/CRX3-Creator.git /CRX3-Creator
RUN cd /CRX3-Creator; pip install -r requirements.txt;
ENTRYPOINT ["/Mythic/mythic/payload_service.sh"]
@@ -1,7 +0,0 @@
#!/bin/bash
cd /Mythic/mythic
export PYTHONPATH=/Mythic:/Mythic/mythic
python3.8 mythic_service.py
@@ -1,4 +0,0 @@
From python:3.8-buster
RUN pip install aio_pika
ENTRYPOINT ["/Mythic/mythic/payload_service.sh"]
@@ -1,98 +0,0 @@
# Go cross compiler (xgo): Base cross-compilation layer
# Copyright (c) 2014 Péter Szilágyi. All rights reserved.
#
# Released under the MIT license.
# pulled and modified from https://github.com/karalabe/xgo/blob/master/docker/go-1.13.4/Dockerfile
FROM ubuntu:18.04
# Mark the image as xgo enabled to support xgo-in-xgo
ENV XGO_IN_XGO 1
# Configure the Go environment, since it's not going to change
ENV PATH /usr/local/go/bin:$PATH
ENV GOPATH /go
# Inject the remote file fetcher and checksum verifier
ADD fetch.sh /fetch.sh
ENV FETCH /fetch.sh
RUN chmod +x $FETCH
# Make sure apt-get is up to date and dependent packages are installed
RUN \
apt-get update && \
apt-get install -y automake autogen build-essential ca-certificates cmake \
gcc-5-aarch64-linux-gnu g++-5-aarch64-linux-gnu libc6-dev-arm64-cross \
gcc-5-multilib g++-5-multilib clang llvm-dev \
libtool libxml2-dev uuid-dev libssl-dev swig openjdk-8-jdk pkg-config patch \
make xz-utils cpio wget zip unzip p7zip git mercurial bzr texinfo help2man \
--no-install-recommends
RUN \
apt-get install -y python3 python3-pip
RUN pip3 install aio_pika
# Fix any stock package issues
RUN ln -s /usr/include/asm-generic /usr/include/asm
##########################
# Darwin Toolchain build #
##########################
# Configure the container for OSX cross compilation
ENV OSX_SDK MacOSX10.11.sdk
ENV OSX_SDK_PATH https://s3.dockerproject.org/darwin/v2/$OSX_SDK.tar.xz
# Make libxar known to the ld64 and cctools build
ENV LD_LIBRARY_PATH=/osxcross/target/lib
# Download the osx sdk and build the osx toolchain
# We download the osx sdk, patch it and pack it again to be able to throw the patched version at osxcross
RUN \
$FETCH $OSX_SDK_PATH dd228a335194e3392f1904ce49aff1b1da26ca62 && \
tar -xf `basename $OSX_SDK_PATH` && rm -f `basename $OSX_SDK_PATH`
ADD patch.tar.xz $OSX_SDK/usr/include/c++
RUN tar -cf - $OSX_SDK/ | xz -c - > $OSX_SDK.tar.xz && rm -rf $OSX_SDK
# Actually build the toolchain
RUN \
git clone https://github.com/tpoechtrager/osxcross.git && \
cd osxcross && git checkout 88cb6e8d0d7675cae7c8a2d66c11f58237101df0 && cd ../ && \
mv $OSX_SDK.tar.xz /osxcross/tarballs/ && \
OSX_VERSION_MIN=10.10 UNATTENDED=1 LD_LIBRARY_PATH=/osxcross/target/lib /osxcross/build.sh
ENV PATH /osxcross/target/bin:$PATH
# Inject the new Go root distribution downloader and bootstrapper
ADD bootstrap_pure.sh /bootstrap_pure.sh
ENV BOOTSTRAP_PURE /bootstrap_pure.sh
RUN chmod +x $BOOTSTRAP_PURE
# Inject the container entry point, the build script
ADD build.sh /build.sh
ENV BUILD /build.sh
RUN chmod +x $BUILD
ENV GO_VERSION 11304
# Make libxar known to the ld64 and cctools build
ENV LD_LIBRARY_PATH=/osxcross/target/lib
RUN \
export ROOT_DIST=https://storage.googleapis.com/golang/go1.13.4.linux-amd64.tar.gz && \
export ROOT_DIST_SHA=692d17071736f74be04a72a06dab9cac1cd759377bd85316e52b2227604c004c && \
\
$BOOTSTRAP_PURE
ENV GOROOT /usr/local/go
ENV GOPATH /go/src:/go/src/poseidon
RUN go get github.com/google/shlex \
github.com/kbinani/screenshot \
github.com/tmc/scp \
github.com/xorrior/keyctl \
golang.org/x/crypto/ssh \
golang.org/x/sync/semaphore \
github.com/gorilla/websocket
ENTRYPOINT ["/Mythic/mythic/payload_service.sh"]
-1
View File
@@ -1 +0,0 @@
From itsafeaturemythic/python38_sanic_c2profile:0.0.1
-17
View File
@@ -1,17 +0,0 @@
{
"instances": [
{
"ServerHeaders": {
"Server": "NetDNA-cache/2.2",
"Cache-Control": "max-age=0, no-cache",
"Pragma": "no-cache",
"Connection": "keep-alive",
"Content-Type": "application/javascript; charset=utf-8"
},
"port": 80,
"key_path": "",
"cert_path": "",
"debug": true
}
]
}
-10
View File
@@ -1,10 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Page Not Found!</title>
</head>
<body>
</body>
</html>
-115
View File
@@ -1,115 +0,0 @@
#!/usr/bin/env python3
from sanic import Sanic
from sanic.response import html, redirect, text, raw
from sanic.exceptions import NotFound
import sys
import asyncio
import ssl
from pathlib import Path
import requests
import json
import os
config = {}
async def print_flush(message):
print(message)
sys.stdout.flush()
async def server_error_handler(request, exception):
return html("Error: Requested URL {} not found".format(request.url), status=404, headers=config[request.app.name]['headers'])
async def agent_message(request, **kwargs):
global config
try:
if config[request.app.name]['debug']:
await print_flush("agent_message request from: {} with {} and {}".format(request.url, request.cookies, request.headers))
await print_flush(" and URI: {}".format(request.query_string))
if config[request.app.name]['debug']:
await print_flush("Forwarding along to: {}".format(config['mythic_address']))
if request.method == "POST":
# manipulate the request if needed
#await MythicCallbackRPC().add_event_message(message="got a POST message")
response = requests.post(config['mythic_address'], data=request.body, verify=False, cookies=request.cookies, headers=request.headers)
else:
# manipulate the request if needed
#await MythicCallbackRPC().add_event_message(message="got a GET message")
response = requests.get(config['mythic_address'] + "?{}".format(request.query_string), verify=False, data=request.body, cookies=request.cookies, headers=request.headers)
return raw(response.content, headers=config[request.app.name]['headers'], status=response.status_code)
except Exception as e:
if config[request.app.name]['debug']:
await print_flush("error in agent_message: {}".format(str(e)))
return await no_match(request, NotFound)
if __name__ == "__main__":
sys.path.append("/Mythic/mythic")
from C2ProfileBase import *
from MythicCallbackRPC import *
config_file = open("config.json", 'rb')
main_config = json.loads(config_file.read().decode('utf-8'))
print("Opening config and starting instances...")
sys.stdout.flush()
# basic mapping of the general endpoints to the real endpoints
try:
config['mythic_address'] = os.environ['MYTHIC_ADDRESS']
except Exception as e:
print("failed to find MYTHIC_ADDRESS environment variable")
sys.stdout.flush()
sys.exit(1)
# now look at the specific instances to start
for inst in main_config['instances']:
config[str(inst['port'])] = {'debug': inst['debug'],
'headers': inst['ServerHeaders']}
if inst['debug']:
print("Debugging statements are enabled. This gives more context, but might be a performance hit")
else:
print("Debugging statements are disabled")
sys.stdout.flush()
# now to create an app instance to handle responses
app = Sanic(str(inst['port']))
app.config['REQUEST_MAX_SIZE'] = 1000000000
app.config['REQUEST_TIMEOUT'] = 600
app.config['RESPONSE_TIMEOUT'] = 600
app.add_route(agent_message, "/<uri:path>", methods=['GET','POST'])
app.add_route(agent_message, "/", methods=['GET','POST'])
app.error_handler.add(Exception, server_error_handler)
keyfile = Path(inst['key_path'])
certfile = Path(inst['cert_path'])
if keyfile.is_file() and certfile.is_file():
context = ssl.create_default_context(purpose=ssl.Purpose.CLIENT_AUTH)
context.load_cert_chain(inst['cert_path'], keyfile=inst['key_path'])
if inst['debug']:
server = app.create_server(host="0.0.0.0", port=inst['port'], ssl=context, debug=False, return_asyncio_server=True, access_log=True)
else:
server = app.create_server(host="0.0.0.0", port=inst['port'], ssl=context, debug=False, return_asyncio_server=True, access_log=False)
if inst['debug']:
print("using SSL for port {}".format(inst['port']))
sys.stdout.flush()
else:
if inst['debug']:
print("not using SSL for port {}".format(inst['port']))
sys.stdout.flush()
if inst['debug']:
server = app.create_server(host="0.0.0.0", port=inst['port'], debug=False, return_asyncio_server=True, access_log=True)
else:
server = app.create_server(host="0.0.0.0", port=inst['port'], debug=False, return_asyncio_server=True, access_log=False)
task = asyncio.ensure_future(server)
try:
loop = asyncio.get_event_loop()
def callback(fut):
try:
fetch_count = fut.result()
except:
print("port already in use")
sys.stdout.flush()
sys.exit()
task.add_done_callback(callback)
loop.run_forever()
except:
sys.exit()
loop.stop()
-130
View File
@@ -1,130 +0,0 @@
from enum import Enum
from abc import abstractmethod
import json
class ParameterType(Enum):
String = "String"
ChooseOne = "ChooseOne"
Array = "Array"
Date = "Date"
Dictionary = "Dictionary"
class C2ProfileParameter:
def __init__(
self,
name: str,
description: str,
default_value: str = "",
randomize: bool = False,
format_string: str = "",
parameter_type: ParameterType = ParameterType.String,
required: bool = True,
verifier_regex: str = "",
choices: [str] = None,
):
self.name = name
self.description = description
self.randomize = randomize
self.format_string = format_string
self.parameter_type = parameter_type
self.required = required
self.verifier_regex = verifier_regex
self.choices = choices
self.default_value = ""
if self.parameter_type == ParameterType.ChooseOne and choices is not None:
self.default_value = "\n".join(choices)
else:
self.default_value = default_value
def to_json(self):
return {
"name": self.name,
"description": self.description,
"default_value": self.default_value if self.parameter_type not in [ParameterType.Array, ParameterType.Dictionary] else json.dumps(self.default_value),
"randomize": self.randomize,
"format_string": self.format_string,
"required": self.required,
"parameter_type": self.parameter_type.value,
"verifier_regex": self.verifier_regex,
}
class C2Profile:
@property
@abstractmethod
def name(self):
pass
@property
@abstractmethod
def description(self):
pass
@property
@abstractmethod
def author(self):
pass
@property
@abstractmethod
def is_p2p(self):
pass
@property
@abstractmethod
def is_server_routed(self):
pass
@property
@abstractmethod
def mythic_encrypts(self):
pass
@property
@abstractmethod
def parameters(self):
pass
def to_json(self):
return {
"name": self.name,
"description": self.description,
"author": self.author,
"mythic_encrypts": self.mythic_encrypts,
"is_p2p": self.is_p2p,
"is_server_routed": self.is_server_routed,
"params": [x.to_json() for x in self.parameters],
}
class RPCStatus(Enum):
Success = "success"
Error = "error"
class RPCResponse:
def __init__(self, status: RPCStatus = None, response: str = None):
self.status = status
self.response = response
@property
def status(self):
return self._status
@status.setter
def status(self, status):
self._status = status
@property
def response(self):
return self._response
@response.setter
def response(self, response):
self._response = response
def to_json(self):
return {"status": self.status.value, "response": self.response}
@@ -1,99 +0,0 @@
from aio_pika import connect_robust, IncomingMessage, Message
import asyncio
import uuid
import json
from enum import Enum
class MythicStatus(Enum):
Success = "success"
Error = "error"
class RPCResponse:
def __init__(self, resp: dict):
self._raw_resp = resp
if resp["status"] == "success":
self.status = MythicStatus.Success
self.response = resp["response"] if "response" in resp else ""
self.error_message = None
else:
self.status = MythicStatus.Error
self.error_message = resp["error"]
self.response = None
@property
def status(self):
return self._status
@status.setter
def status(self, status):
self._status = status
@property
def error_message(self):
return self._error_message
@error_message.setter
def error_message(self, error_message):
self._error_message = error_message
@property
def response(self):
return self._response
@response.setter
def response(self, response):
self._response = response
class MythicBaseRPC:
def __init__(self):
self.connection = None
self.channel = None
self.callback_queue = None
self.futures = {}
self.loop = asyncio.get_event_loop()
async def connect(self):
config_file = open("/Mythic/mythic/rabbitmq_config.json", "rb")
main_config = json.loads(config_file.read().decode("utf-8"))
config_file.close()
self.connection = await connect_robust(
host=main_config["host"],
login=main_config["username"],
password=main_config["password"],
virtualhost=main_config["virtual_host"],
)
self.channel = await self.connection.channel()
self.callback_queue = await self.channel.declare_queue(exclusive=True)
await self.callback_queue.consume(self.on_response)
return self
def on_response(self, message: IncomingMessage):
future = self.futures.pop(message.correlation_id)
future.set_result(message.body)
async def call(self, n, receiver: str = None) -> RPCResponse:
if self.connection is None:
await self.connect()
correlation_id = str(uuid.uuid4())
future = self.loop.create_future()
self.futures[correlation_id] = future
if receiver is None:
router = "c2rpc_queue"
else:
router = "{}_rpc_queue".format(receiver)
await self.channel.default_exchange.publish(
Message(
json.dumps(n).encode(),
content_type="application/json",
correlation_id=correlation_id,
reply_to=self.callback_queue.name,
),
routing_key=router,
)
return RPCResponse(json.loads(await future))
@@ -1,124 +0,0 @@
from MythicBaseRPC import *
import base64
class MythicRPCResponse(RPCResponse):
def __init__(self, resp: RPCResponse):
super().__init__(resp._raw_resp)
if resp.status == MythicStatus.Success:
self.data = resp.response
else:
self.data = None
@property
def data(self):
return self._data
@data.setter
def data(self, data):
self._data = data
class MythicCallbackRPC(MythicBaseRPC):
# returns dictionary of `{"raw": raw_tasking, "encrypted": base64(uuid+encrypted_tasking)}`
async def get_tasking(
self, uuid: str, tasking_size: int = 1
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "get_tasking",
"uuid": uuid,
"tasking_size": tasking_size,
}
)
return MythicRPCResponse(resp)
async def add_route(
self,
source_uuid: str,
destination_uuid: str,
direction: int = 1,
metadata: str = None,
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "add_route",
"source": source_uuid,
"destination": destination_uuid,
"direction": direction,
"metadata": metadata,
}
)
return MythicRPCResponse(resp)
async def remove_route(
self,
source_uuid: str,
destination_uuid: str,
direction: int = 1,
metadata: str = None,
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "remove_route",
"source": source_uuid,
"destination": destination_uuid,
"direction": direction,
"metadata": metadata,
}
)
return MythicRPCResponse(resp)
async def get_callback_info(self, uuid: str) -> MythicRPCResponse:
resp = await self.call({"action": "get_callback_info", "uuid": uuid})
return MythicRPCResponse(resp)
async def get_encryption_data(self, uuid: str, profile: str) -> MythicRPCResponse:
resp = await self.call(
{
"action": "get_encryption_data",
"uuid": uuid,
"c2_profile": profile,
}
)
return MythicRPCResponse(resp)
async def update_callback_info(self, uuid: str, info: dict) -> MythicRPCResponse:
resp = await self.call(
{"action": "update_callback_info", "uuid": uuid, "data": info}
)
return MythicRPCResponse(resp)
async def add_event_message(
self, message: str, level: str = "info"
) -> MythicRPCResponse:
resp = await self.call(
{"action": "add_event_message", "level": level, "message": message}
)
return MythicRPCResponse(resp)
async def encrypt_bytes(
self, data: bytes, uuid: str, with_uuid: bool = False,
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "encrypt_bytes",
"data": base64.b64encode(data).decode(),
"uuid": uuid,
"with_uuid": with_uuid,
}
)
return MythicRPCResponse(resp)
async def decrypt_bytes(
self, data: bytes, uuid: str, with_uuid: bool = False,
) -> MythicRPCResponse:
resp = await self.call(
{
"action": "decrypt_bytes",
"uuid": uuid,
"data": base64.b64encode(data).decode(),
"with_uuid": with_uuid,
}
)
return MythicRPCResponse(resp)
Whitespace-only changes.
Loaded 100 of 1725 files, more files were not shown because too many files have changed in this diff. Show more