diff --git a/README.md b/README.md index 543c607..1154677 100644 --- a/README.md +++ b/README.md @@ -9,34 +9,9 @@ ## Getting Started -The Conquest team server and operator client are meant to be compiled and used on a UNIX operating system. +The Conquest team server and operator client are currently meant to be compiled and used on a Ubuntu/Debian-based operating system. For getting the framework up and running, follow the [installation instructions](./docs/1-INSTALLATION.md). -1. Install Nim - -``` -curl https://nim-lang.org/choosenim/init.sh -sSf | sh -``` - -2. Build the Conquest team server and client. When first used, these commands download all required dependencies and libraries. - -``` -nimble server -nimble client -``` - -3. Start the team server with a C2 profile. - -``` -sudo bin/server -p data/profile.toml -``` - -4. Start the operator client and connect it to a team server - -``` -bin/client [-i
(default: localhost)] [-p (default: 37573)] -``` - -For more information, check out the [docs](./docs/README.md)! +For more information about architecture, usage and features, check out the [documentation](./docs/README.md)! ## Features diff --git a/docs/1-INSTALLATION.md b/docs/1-INSTALLATION.md index 8b6a49d..ff44936 100644 --- a/docs/1-INSTALLATION.md +++ b/docs/1-INSTALLATION.md @@ -1,12 +1,12 @@ # Installation -1. Clone the Conquest repository +## 1. Clone the Conquest repository ``` git clone https://github.com/jakobfriedl/conquest cd conquest ``` -2. Install Nim. +## 2. Install Nim. ```bash curl https://nim-lang.org/choosenim/init.sh -sSf | sh @@ -18,28 +18,40 @@ After it is installed, the Nim binaries need to be added to the PATH. export PATH=/home/kali/.nimble/bin:$PATH ``` -3. Install dependencies +## 3. Install dependencies + +The Conquest binaries for team server and client are designed to be compiled and run on Ubuntu/Debian-based systems. The operator client requires the following dependencies to be installed. -The operator client requires the following dependencies to be installed on Ubuntu/Debian systems. ``` sudo apt update sudo apt install gcc g++ make git curl xz-utils sudo apt install libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev libx11-dev libxrandr-dev libxinerama-dev libxcursor-dev libxi-dev ``` -4. The Conquest binaries for team server and client are designed to be compiled on a UNIX system using the `nimble` command. This command installs and updates all dependencies and third-party libraries automatically. +To run the client on a Windows host, install the dependencies in WSL. Furthermore, to use save file dialogs, the following package is also required + +``` +sudo apt install libgtk2.0-0 +``` + +## 4. Compile conquest + +The Conquest binaries are compiled using the `nimble` command, which installs and updates all Nim libraries and dependencies automatically. + ``` nimble server nimble client ``` -Optionally, the required dependencies can be installed manually using the following command. +Optionally, the required dependencies can be installed manually using the following command prior to the compilation. ``` nimble install -d ``` -4. Start the Conquest team server with a C2 profile. The default profile is located in data/profile.toml and can be adapted by the operator. +## 5. Start the Conquest team server with a C2 profile. + +The default profile is located in [data/profile.toml](../data/profile.toml) and can be adapted by the operator. ``` sudo bin/server -p data/profile ``` @@ -48,7 +60,8 @@ On the first start, the Conquest team server creates the Conquest database in th ![Team server start](../assets/install.png) -5. Start the Conquest operator client +## 6. Start the Conquest operator client + ``` bin/client ``` diff --git a/src/agent/nim.cfg b/src/agent/nim.cfg index 043d670..b673c34 100644 --- a/src/agent/nim.cfg +++ b/src/agent/nim.cfg @@ -5,5 +5,5 @@ --passL:"-s" # Strip symbols, such as sensitive function names -d:CONFIGURATION="PLACEHOLDERAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPLACEHOLDER" -d:MODULES="511" --d:VERBOSE="false" +-d:VERBOSE="true" -o:"/mnt/c/Users/jakob/Documents/Projects/conquest/bin/monarch.x64.exe" \ No newline at end of file diff --git a/src/client/main.nim b/src/client/main.nim index 31a32f0..3f34466 100644 --- a/src/client/main.nim +++ b/src/client/main.nim @@ -1,5 +1,5 @@ import whisky -import tables, times, strutils, strformat, json, parsetoml, base64, os # native_dialogs +import tables, times, strutils, strformat, json, parsetoml, base64, os, native_dialogs import ./utils/[appImGui, globals] import ./views/[dockspace, sessions, listeners, eventlog, console] import ./views/loot/[screenshots, downloads] @@ -123,11 +123,7 @@ proc main(ip: string = "localhost", port: int = 37573) = of CLIENT_AGENT_PAYLOAD: let payload = decode(event.data["payload"].getStr()) try: - let path = fmt"{CONQUEST_ROOT}/bin/monarch.x64.exe" - - # TODO: Using native file dialogs to have the client select the output file path (does not work in WSL) - # let path = callDialogFileSave("Save Payload") - + let path = callDialogFileSave("Save Payload") writeFile(path, payload) except IOError: discard diff --git a/src/client/views/loot/downloads.nim b/src/client/views/loot/downloads.nim index 17fe051..e6c6796 100644 --- a/src/client/views/loot/downloads.nim +++ b/src/client/views/loot/downloads.nim @@ -1,4 +1,4 @@ -import strformat, strutils, times, os, tables # native_dialogs +import strformat, strutils, times, os, tables, native_dialogs import imguin/[cimgui, glfw_opengl, simple] import ../../utils/[appImGui, colors] import ../../../common/[types, utils] @@ -96,11 +96,7 @@ proc draw*(component: DownloadsComponent, showComponent: ptr bool, connection: W if igMenuItem("Download", nil, false, true): # Download file try: - let path = item.path & ".download" - - # TODO: Use native dialogs to select the download location - # let path = callDialogFileSave("Save File") - + let path = callDialogFileSave("Save File") let data = component.contents[item.lootId] writeFile(path, data) except IOError: diff --git a/src/client/views/loot/screenshots.nim b/src/client/views/loot/screenshots.nim index bc9c7a0..d91641a 100644 --- a/src/client/views/loot/screenshots.nim +++ b/src/client/views/loot/screenshots.nim @@ -1,4 +1,4 @@ -import strformat, strutils, times, os, tables # native_dialogs +import strformat, strutils, times, os, tables, native_dialogs import imguin/[cimgui, glfw_opengl, simple] import ../../utils/[appImGui, colors] import ../../../common/[types, utils] @@ -104,11 +104,7 @@ proc draw*(component: ScreenshotsComponent, showComponent: ptr bool, connection: if igMenuItem("Download", nil, false, true): # Download screenshot try: - let path = item.path & "_download.jpeg" - - # TODO: Use native dialogs to select the download location - # let path = callDialogFileSave("Save File") - + let path = callDialogFileSave("Save File") let data = component.textures[item.lootId].data writeFile(path, data) except IOError: