diff --git a/src/agent/nim.cfg b/src/agent/nim.cfg index d26c6e1..c885968 100644 --- a/src/agent/nim.cfg +++ b/src/agent/nim.cfg @@ -4,5 +4,5 @@ --opt:size --passL:"-s" # Strip symbols, such as sensitive function names -d:CONFIGURATION="PLACEHOLDERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPLACEHOLDER" --d:MODULES="255" +-d:MODULES="127" -o:"/mnt/c/Users/jakob/Documents/Projects/conquest/bin/monarch.x64.exe" \ No newline at end of file diff --git a/src/client/task.nim b/src/client/core/task.nim similarity index 98% rename from src/client/task.nim rename to src/client/core/task.nim index f561ab2..c8f11bb 100644 --- a/src/client/task.nim +++ b/src/client/core/task.nim @@ -1,6 +1,6 @@ import std/paths import strutils, sequtils, times, tables -import ../common/[types, sequence, crypto, utils, serialize] +import ../../common/[types, sequence, crypto, utils, serialize] proc parseInput*(input: string): seq[string] = var i = 0 diff --git a/src/client/websocket.nim b/src/client/core/websocket.nim similarity index 97% rename from src/client/websocket.nim rename to src/client/core/websocket.nim index 34cabab..04d9fae 100644 --- a/src/client/websocket.nim +++ b/src/client/core/websocket.nim @@ -1,6 +1,6 @@ import whisky import times, tables, json, base64 -import ../common/[types, utils, serialize, event] +import ../../common/[types, utils, serialize, event] export sendHeartbeat, recvEvent #[ diff --git a/src/client/main.nim b/src/client/main.nim index 90a6685..d719f41 100644 --- a/src/client/main.nim +++ b/src/client/main.nim @@ -3,8 +3,9 @@ import tables, strutils, strformat, json, parsetoml, base64, os # native_dialogs import ./utils/[appImGui, globals] import ./views/[dockspace, sessions, listeners, eventlog, console] import ./views/modals/generatePayload +import ./views/loot/[downloads, screenshots] import ../common/[types, utils, crypto] -import ./websocket +import ./core/websocket import sugar @@ -19,6 +20,8 @@ proc main(ip: string = "localhost", port: int = 37573) = showSessionsTable = true showListeners = true showEventlog = true + showDownloads = false + showScreenshots = false consoles: Table[string, ConsoleComponent] var @@ -30,6 +33,8 @@ proc main(ip: string = "localhost", port: int = 37573) = views["Sessions [Table View]"] = addr showSessionsTable views["Listeners"] = addr showListeners views["Eventlog"] = addr showEventlog + views["Loot::Downloads"] = addr showDownloads + views["Loot::Screenshots"] = addr showScreenshots # Create components var @@ -37,6 +42,8 @@ proc main(ip: string = "localhost", port: int = 37573) = sessionsTable = SessionsTable("Sessions [Table View]", addr consoles) listenersTable = ListenersTable("Listeners") eventlog = Eventlog("Eventlog") + lootDownloads = LootDownloads("Downloads") + lootScreenshots = LootScreenshots("Screenshots") let io = igGetIO() @@ -151,6 +158,8 @@ proc main(ip: string = "localhost", port: int = 37573) = if showSessionsTable: sessionsTable.draw(addr showSessionsTable) if showListeners: listenersTable.draw(addr showListeners, connection) if showEventlog: eventlog.draw(addr showEventlog) + if showDownloads: lootDownloads.draw(addr showDownloads) + if showScreenshots: lootScreenshots.draw(addr showScreenshots) # Show console windows var newConsoleTable: Table[string, ConsoleComponent] diff --git a/src/client/views/console.nim b/src/client/views/console.nim index a1a5a38..4182243 100644 --- a/src/client/views/console.nim +++ b/src/client/views/console.nim @@ -4,7 +4,7 @@ import imguin/[cimgui, glfw_opengl, simple] import ../utils/[appImGui, colors] import ../../common/[types, utils] import ../../modules/manager -import ../[task, websocket] +import ../core/[task, websocket] const MAX_INPUT_LENGTH = 512 type diff --git a/src/client/views/dockspace.nim b/src/client/views/dockspace.nim index 2931782..037e298 100644 --- a/src/client/views/dockspace.nim +++ b/src/client/views/dockspace.nim @@ -1,4 +1,4 @@ -import tables +import tables, strutils import imguin/[cimgui, glfw_opengl, simple] import ../utils/appImGui @@ -56,6 +56,8 @@ proc draw*(component: DockspaceComponent, showComponent: ptr bool, views: Table[ igDockBuilderDockWindow("Sessions [Table View]", dockTopLeft[]) igDockBuilderDockWindow("Listeners", dockBottom[]) igDockBuilderDockWindow("Eventlog", dockTopRight[]) + igDockBuilderDockWindow("Downloads", dockBottom[]) + igDockBuilderDockWindow("Screenshots", dockBottom[]) igDockBuilderDockWindow("Dear ImGui Demo", dockTopRight[]) igDockBuilderFinish(dockspaceId) @@ -74,8 +76,18 @@ proc draw*(component: DockspaceComponent, showComponent: ptr bool, views: Table[ if igBeginMenu("Views", true): # Create a menu item to toggle each of the main views of the application for view, showView in views: - if igMenuItem(view, nil, showView[], showView != nil): - showView[] = not showView[] + if not view.contains("::"): + if igMenuItem(view, nil, showView[], showView != nil): + showView[] = not showView[] + + if igBeginMenu("Loot", true): + for view, showView in views: + if view.startsWith("Loot"): + let item = view.split("::", 1)[1].strip() + if igMenuItem(item, nil, showView[], showView != nil): + showView[] = not showView[] + igEndMenu() + igEndMenu() igEndMenuBar() \ No newline at end of file diff --git a/src/client/views/listeners.nim b/src/client/views/listeners.nim index eda4264..60b9584 100644 --- a/src/client/views/listeners.nim +++ b/src/client/views/listeners.nim @@ -4,7 +4,7 @@ import imguin/[cimgui, glfw_opengl, simple] import ../utils/appImGui import ../../common/[types, utils] import ./modals/[startListener, generatePayload] -import ../websocket +import ../core/websocket type ListenersTableComponent* = ref object of RootObj diff --git a/src/client/views/loot/downloads.nim b/src/client/views/loot/downloads.nim new file mode 100644 index 0000000..77aed0c --- /dev/null +++ b/src/client/views/loot/downloads.nim @@ -0,0 +1,19 @@ +import strformat, strutils, times +import imguin/[cimgui, glfw_opengl, simple] +import ../../utils/[appImGui, colors] +import ../../../common/types + +type + LootDownloadsComponent* = ref object of RootObj + title: string + + +proc LootDownloads*(title: string): LootDownloadsComponent = + result = new LootDownloadsComponent + result.title = title + +proc draw*(component: LootDownloadsComponent, showComponent: ptr bool) = + igBegin(component.title, showComponent, 0) + defer: igEnd() + + igText("asd") diff --git a/src/client/views/loot/screenshots.nim b/src/client/views/loot/screenshots.nim new file mode 100644 index 0000000..f894371 --- /dev/null +++ b/src/client/views/loot/screenshots.nim @@ -0,0 +1,19 @@ +import strformat, strutils, times +import imguin/[cimgui, glfw_opengl, simple] +import ../../utils/[appImGui, colors] +import ../../../common/types + +type + LootScreenshotsComponent* = ref object of RootObj + title: string + + +proc LootScreenshots*(title: string): LootScreenshotsComponent = + result = new LootScreenshotsComponent + result.title = title + +proc draw*(component: LootScreenshotsComponent, showComponent: ptr bool) = + igBegin(component.title, showComponent, 0) + defer: igEnd() + + igText("asd") diff --git a/src/client/views/sessions.nim b/src/client/views/sessions.nim index ad1a232..a3dd5ba 100644 --- a/src/client/views/sessions.nim +++ b/src/client/views/sessions.nim @@ -64,8 +64,8 @@ proc draw*(component: SessionsTableComponent, showComponent: ptr bool) = igTableSetupColumn("AgentID", ImGuiTableColumnFlags_NoReorder.int32 or ImGuiTableColumnFlags_NoHide.int32, 0.0f, 0) igTableSetupColumn("ListenerID", ImGuiTableColumnFlags_DefaultHide.int32, 0.0f, 0) - igTableSetupColumn("Internal", ImGuiTableColumnFlags_None.int32, 0.0f, 0) - igTableSetupColumn("External", ImGuiTableColumnFlags_DefaultHide.int32, 0.0f, 0) + igTableSetupColumn("IP (Internal)", ImGuiTableColumnFlags_None.int32, 0.0f, 0) + igTableSetupColumn("IP (External)", ImGuiTableColumnFlags_DefaultHide.int32, 0.0f, 0) igTableSetupColumn("Username", ImGuiTableColumnFlags_None.int32, 0.0f, 0) igTableSetupColumn("Hostname", ImGuiTableColumnFlags_None.int32, 0.0f, 0) igTableSetupColumn("Domain", ImGuiTableColumnFlags_None.int32, 0.0f, 0) diff --git a/src/common/types.nim b/src/common/types.nim index 9ee33a1..05fcfe1 100644 --- a/src/common/types.nim +++ b/src/common/types.nim @@ -346,4 +346,4 @@ type sleepDelay*: uint32 sleepTechnique*: SleepObfuscationTechnique spoofStack*: bool - modules*: uint32 \ No newline at end of file + modules*: uint32 diff --git a/src/server/api/handlers.nim b/src/server/api/handlers.nim index 171bb70..d529023 100644 --- a/src/server/api/handlers.nim +++ b/src/server/api/handlers.nim @@ -2,9 +2,7 @@ import terminal, strformat, strutils, sequtils, tables, system, std/[dirs, paths import ../globals import ../db/database -import ../protocol/packer -import ../core/logger -import ../websocket +import ../core/[packer, logger, websocket] import ../../common/[types, utils, serialize] #[ diff --git a/src/server/api/routes.nim b/src/server/api/routes.nim index 9a6fbbe..52a7086 100644 --- a/src/server/api/routes.nim +++ b/src/server/api/routes.nim @@ -3,9 +3,8 @@ import strutils, base64 import ./handlers import ../globals -import ../core/logger +import ../core/[logger, websocket] import ../../common/[types, utils, serialize, profile] -import ../websocket # Not Found proc error404*(request: Request) = diff --git a/src/server/core/builder.nim b/src/server/core/builder.nim index f390196..2c8007d 100644 --- a/src/server/core/builder.nim +++ b/src/server/core/builder.nim @@ -1,10 +1,9 @@ import terminal, strformat, strutils, sequtils, tables, system, osproc, streams, parsetoml import ../globals -import ../core/logger +import ../core/[logger, websocket] import ../db/database import ../../common/[types, utils, serialize, crypto] -import ../websocket const PLACEHOLDER = "PLACEHOLDER" diff --git a/src/server/core/listener.nim b/src/server/core/listener.nim index c334caf..57051bb 100644 --- a/src/server/core/listener.nim +++ b/src/server/core/listener.nim @@ -4,9 +4,8 @@ import parsetoml import ../api/routes import ../db/database -import ../core/logger +import ../core/[logger, websocket] import ../../common/[types, profile] -import ../websocket proc serve(listener: Listener) {.thread.} = try: diff --git a/src/server/protocol/packer.nim b/src/server/core/packer.nim similarity index 100% rename from src/server/protocol/packer.nim rename to src/server/core/packer.nim diff --git a/src/server/websocket.nim b/src/server/core/websocket.nim similarity index 98% rename from src/server/websocket.nim rename to src/server/core/websocket.nim index 5cce42b..f20327f 100644 --- a/src/server/websocket.nim +++ b/src/server/core/websocket.nim @@ -1,6 +1,6 @@ import times, json, base64, parsetoml, strformat -import ../common/[types, utils, event] -import ./core/logger +import ./logger +import ../../common/[types, utils, event] export sendHeartbeat, recvEvent proc `%`*(agent: Agent): JsonNode = diff --git a/src/server/main.nim b/src/server/main.nim index 3ea5cc6..ca70c41 100644 --- a/src/server/main.nim +++ b/src/server/main.nim @@ -1,12 +1,11 @@ +import mummy, mummy/routers import terminal, parsetoml, json, math, base64, times import strutils, strformat, system, tables -import ./core/[listener, logger, builder] import ./globals import ./db/database +import ./core/[listener, logger, builder, websocket] import ../common/[types, crypto, utils, profile, event] -import ./websocket -import mummy, mummy/routers proc header() = echo ""