diff --git a/src/agents/monarch/core/heartbeat.nim b/src/agents/monarch/core/heartbeat.nim index 4a5b376..41eb266 100644 --- a/src/agents/monarch/core/heartbeat.nim +++ b/src/agents/monarch/core/heartbeat.nim @@ -34,15 +34,6 @@ proc serializeHeartbeat*(request: Heartbeat): seq[byte] = # TODO: Encrypt check-in / heartbeat request body # Serialize header - packer - .add(request.header.magic) - .add(request.header.version) - .add(request.header.packetType) - .add(request.header.flags) - .add(request.header.seqNr) - .add(cast[uint32](body.len)) - .addData(request.header.hmac) - - let header = packer.pack() + let header = packer.packHeader(request.header, uint32(body.len)) return header & body \ No newline at end of file diff --git a/src/agents/monarch/core/metadata.nim b/src/agents/monarch/core/metadata.nim index 2b5cc1a..0f848f4 100644 --- a/src/agents/monarch/core/metadata.nim +++ b/src/agents/monarch/core/metadata.nim @@ -243,15 +243,6 @@ proc serializeRegistrationData*(data: AgentRegistrationData): seq[byte] = # TODO: Encrypt metadata # Serialize header - packer - .add(data.header.magic) - .add(data.header.version) - .add(data.header.packetType) - .add(data.header.flags) - .add(data.header.seqNr) - .add(cast[uint32](metadata.len)) - .addData(data.header.hmac) - - let header = packer.pack() + let header = packer.packHeader(data.header, uint32(metadata.len)) return header & metadata diff --git a/src/agents/monarch/core/taskresult.nim b/src/agents/monarch/core/taskresult.nim index 9267d3c..2cbafe9 100644 --- a/src/agents/monarch/core/taskresult.nim +++ b/src/agents/monarch/core/taskresult.nim @@ -48,16 +48,7 @@ proc serializeTaskResult*(taskResult: TaskResult): seq[byte] = # TODO: Encrypt result body # Serialize header - packer - .add(taskResult.header.magic) - .add(taskResult.header.version) - .add(taskResult.header.packetType) - .add(taskResult.header.flags) - .add(taskResult.header.seqNr) - .add(cast[uint32](body.len)) - .addData(taskResult.header.hmac) - - let header = packer.pack() + let header = packer.packHeader(taskResult.header, uint32(body.len)) # TODO: Calculate and patch HMAC diff --git a/src/agents/monarch/nim.cfg b/src/agents/monarch/nim.cfg index 113a71e..203b932 100644 --- a/src/agents/monarch/nim.cfg +++ b/src/agents/monarch/nim.cfg @@ -1,8 +1,8 @@ # Agent configuration --d:ListenerUuid="A5466110" --d:Octet1="172" --d:Octet2="29" --d:Octet3="177" --d:Octet4="43" --d:ListenerPort=8888 +-d:ListenerUuid="B10CE89E" +-d:Octet1="127" +-d:Octet2="0" +-d:Octet3="0" +-d:Octet4="1" +-d:ListenerPort=9999 -d:SleepDelay=5 diff --git a/src/common/serialize.nim b/src/common/serialize.nim index 3d3d945..a5491fe 100644 --- a/src/common/serialize.nim +++ b/src/common/serialize.nim @@ -125,4 +125,16 @@ proc getVarLengthMetadata*(unpacker: Unpacker): string = return "" # Read content - return unpacker.getBytes(int(length)).toString() \ No newline at end of file + return unpacker.getBytes(int(length)).toString() + +proc packHeader*(packer: Packer, header: Header, bodySize: uint32): seq[byte] = + packer + .add(header.magic) + .add(header.version) + .add(header.packetType) + .add(header.flags) + .add(header.seqNr) + .add(bodySize) + .addData(header.hmac) + + return packer.pack() \ No newline at end of file diff --git a/src/common/types.nim b/src/common/types.nim index 25e2a6e..4379077 100644 --- a/src/common/types.nim +++ b/src/common/types.nim @@ -27,6 +27,7 @@ type # Flags should be powers of 2 so they can be connected with or operators FLAG_PLAINTEXT = 0'u16 FLAG_ENCRYPTED = 1'u16 + FLAG_COMPRESSED = 2'u16 CommandType* = enum CMD_SLEEP = 0'u16 @@ -154,7 +155,7 @@ type HTTP = "http" Listener* = ref object - name*: string + listenerId*: string address*: string port*: int protocol*: Protocol diff --git a/src/server/core/agent.nim b/src/server/core/agent.nim index ab03161..626466f 100644 --- a/src/server/core/agent.nim +++ b/src/server/core/agent.nim @@ -143,7 +143,7 @@ proc agentBuild*(cq: Conquest, listener, sleep, payload: string) = # The following shows the format of the agent configuration file that defines compile-time variables let config = fmt""" # Agent configuration - -d:ListenerUuid="{listener.name}" + -d:ListenerUuid="{listener.listenerId}" -d:Octet1="{first}" -d:Octet2="{second}" -d:Octet3="{third}" diff --git a/src/server/core/listener.nim b/src/server/core/listener.nim index a55c44f..84f5ee3 100644 --- a/src/server/core/listener.nim +++ b/src/server/core/listener.nim @@ -11,11 +11,11 @@ proc delListener(cq: Conquest, listenerName: string) = cq.listeners.del(listenerName) proc add(cq: Conquest, listener: Listener) = - cq.listeners[listener.name] = listener + cq.listeners[listener.listenerId] = listener -proc newListener*(name: string, address: string, port: int): Listener = +proc newListener*(listenerId: string, address: string, port: int): Listener = var listener = new Listener - listener.name = name + listener.listenerId = listenerId listener.address = address listener.port = port listener.protocol = HTTP @@ -91,7 +91,7 @@ proc restartListeners*(cq: Conquest) = for l in listeners: let settings = newSettings( - appName = l.name, + appName = l.listenerId, debug = false, address = "", port = Port(l.port) @@ -107,7 +107,7 @@ proc restartListeners*(cq: Conquest) = try: discard listener.runAsync() cq.add(l) - cq.writeLine(fgGreen, "[+] ", resetStyle, "Restarted listener", fgGreen, fmt" {l.name} ", resetStyle, fmt"on port {$l.port}.") + cq.writeLine(fgGreen, "[+] ", resetStyle, "Restarted listener", fgGreen, fmt" {l.listenerId} ", resetStyle, fmt"on port {$l.port}.") except CatchableError as err: cq.writeLine(fgRed, styleBright, "[-] Failed to restart listener: ", err.msg) diff --git a/src/server/db/dbListener.nim b/src/server/db/dbListener.nim index 4978e53..adee244 100644 --- a/src/server/db/dbListener.nim +++ b/src/server/db/dbListener.nim @@ -21,7 +21,7 @@ proc dbStoreListener*(cq: Conquest, listener: Listener): bool = conquestDb.exec(""" INSERT INTO listeners (name, address, port, protocol) VALUES (?, ?, ?, ?); - """, listener.name, listener.address, listener.port, $listener.protocol) + """, listener.listenerId, listener.address, listener.port, $listener.protocol) conquestDb.close() except: @@ -38,10 +38,10 @@ proc dbGetAllListeners*(cq: Conquest): seq[Listener] = let conquestDb = openDatabase(cq.dbPath, mode=dbReadWrite) for row in conquestDb.iterate("SELECT name, address, port, protocol FROM listeners;"): - let (name, address, port, protocol) = row.unpack((string, string, int, string)) + let (listenerId, address, port, protocol) = row.unpack((string, string, int, string)) let l = Listener( - name: name, + listenerId: listenerId, address: address, port: port, protocol: stringToProtocol(protocol), diff --git a/src/server/task/packer.nim b/src/server/task/packer.nim index b200120..23a2979 100644 --- a/src/server/task/packer.nim +++ b/src/server/task/packer.nim @@ -24,16 +24,7 @@ proc serializeTask*(task: Task): seq[byte] = # TODO: Encrypt payload body # Serialize header - packer - .add(task.header.magic) - .add(task.header.version) - .add(task.header.packetType) - .add(task.header.flags) - .add(task.header.seqNr) - .add(cast[uint32](payload.len)) - .addData(task.header.hmac) - - let header = packer.pack() + let header = packer.packHeader(task.header, uint32(payload.len)) # TODO: Calculate and patch HMAC diff --git a/src/server/utils.nim b/src/server/utils.nim index 278ceea..3508758 100644 --- a/src/server/utils.nim +++ b/src/server/utils.nim @@ -97,7 +97,7 @@ proc writeRow(cq: Conquest, row: seq[Cell]) = proc drawTable*(cq: Conquest, listeners: seq[Listener]) = # Column headers and widths - let headers = @["Name", "Address", "Port", "Protocol", "Agents"] + let headers = @["UUID", "Address", "Port", "Protocol", "Agents"] let widths = @[8, 15, 5, 8, 6] let headerCells = headers.mapIt(Cell(text: it, fg: fgWhite, bg: bgDefault)) @@ -110,10 +110,10 @@ proc drawTable*(cq: Conquest, listeners: seq[Listener]) = for l in listeners: # Get number of agents connected to the listener - let connectedAgents = cq.agents.values.countIt(it.listenerId == l.name) + let connectedAgents = cq.agents.values.countIt(it.listenerId == l.listenerId) let rowCells = @[ - Cell(text: l.name, fg: fgGreen), + Cell(text: l.listenerId, fg: fgGreen), Cell(text: l.address), Cell(text: $l.port), Cell(text: $l.protocol), @@ -160,7 +160,7 @@ proc timeSince*(agent: Agent, timestamp: DateTime): Cell = proc drawTable*(cq: Conquest, agents: seq[Agent]) = - let headers: seq[string] = @["Name", "Address", "Username", "Hostname", "Operating System", "Process", "PID", "Activity"] + let headers: seq[string] = @["UUID", "Address", "Username", "Hostname", "Operating System", "Process", "PID", "Activity"] let widths = @[8, 15, 15, 15, 16, 13, 5, 8] let headerCells = headers.mapIt(Cell(text: it, fg: fgWhite, bg: bgDefault))