Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
name: Build RAVEN C2 Framework

on:
push:
branches: ["dev"]
workflow_dispatch:

permissions:
contents: write

jobs:
build:
runs-on: ubuntu-latest

steps:
- name: Checkout Repository
uses: actions/checkout@v4

- name: Set Up JDK 21
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: 21
cache: maven

- name: Clear Maven JavaFX Cache
run: rm -rf ~/.m2/repository/org/openjfx

- name: Build With Maven
working-directory: RAVEN
run: mvn clean package -DskipTests -Plinux

- name: Copy JAR To Output Folder
run: |
JAR=$(ls RAVEN/target/*.jar | grep -v original | head -1)
mv "$JAR" RAVEN/raven.jar
rm -rf RAVEN/target
echo "JAR copied: $JAR"

- name: Commit Output To Repo
run: |
git config user.name "github-actions"
git config user.email "github-actions@github.com"
git add RAVEN/raven.jar
git diff --cached --quiet || git commit -m "ci: build #${{ github.run_number }} [skip ci]"
git push

- name: Upload JAR As Artifact
uses: actions/upload-artifact@v4
with:
name: raven-jar
path: RAVEN/raven.jar
retention-days: 30

- name: Create Tag
run: |
git tag "RAVEN-C2-V3.0-${{ github.run_number }}"
git push origin "RAVEN-C2-V3.0-${{ github.run_number }}"

- name: Create Release
uses: softprops/action-gh-release@v2
with:
tag_name: v3.0-build-${{ github.run_number }}
name: "RAVEN C2 v3.0 - Build #${{ github.run_number }}"
files: output/raven.jar
generate_release_notes: false
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
10 changes: 5 additions & 5 deletions RAVEN/config/server/raven.properties
Original file line number Diff line number Diff line change
Expand Up @@ -42,13 +42,13 @@ agent.command.timeout=120000
agent.max.connections=100
agent.buffer.size=8192

logging.level=INFO
logging.verbose=false
logging.max.entries=1000
logging.level=VERBOSE
logging.verbose=true
logging.max.entries=10000
logging.file=logs/raven.log
logging.file.enabled=false
logging.file.enabled=true

db.type=none
db.type=sqlite
db.path=database
db.url=
db.name=raven
Expand Down
32 changes: 21 additions & 11 deletions RAVEN/src/main/java/com/raven/Start.java
Original file line number Diff line number Diff line change
Expand Up @@ -82,13 +82,13 @@ private static ListenerMode ResolveMode(List<String> Args) {
}

private static String ResolveInterface(List<String> Args) {
if (Has(Args, "-TC")) return "teamclient";
if (Has(Args, "-TSC")) return "teamserver-cli";
if (Has(Args, "-TSW")) return "teamserver-web";
if (Has(Args, "-TSG")) return "teamserver-gui";
if (Has(Args, "-C", "-cli")) return "cli";
if (Has(Args, "-G", "-gui")) return "gui";
if (Has(Args, "-W", "-web")) return "web";
if (Has(Args, "-TS", "-teamserver")) return "teamserver";
if (Has(Args, "-TSC", "-teamserver-cli")) return "teamserver-cli";
if (Has(Args, "-TSW", "-teamserver-web")) return "teamserver-web";
if (Has(Args, "-TSG", "-teamserver-gui")) return "teamserver-gui";
if (Has(Args, "-C", "-cli")) return "cli";
if (Has(Args, "-G", "-gui")) return "gui";
if (Has(Args, "-W", "-web")) return "web";
return Config.GetInterfaceMode();
}

Expand All @@ -97,20 +97,30 @@ private static void StartInterface(String Host, int Port, ListenerMode Mode, Str
switch (Interface) {
case "cli" -> new CLI(Config).Run(Host, Port, Mode);
case "gui" -> GUI.Launch(Config);
case "teamserver-cli" -> new CLI(Config).RunTeamServer(Host, Port, Mode);
case "teamserver-gui" -> GUI.LaunchTeam(Config);
case "teamclient" -> {
case "teamserver" -> {
int TeamPort = ParseInt(Arg(Args, "-tp", "-tport", String.valueOf(Config.GetTeamServerPort())), Config.GetTeamServerPort());
new TeamServer(Config, Mode).RunAsBackend(Host, Port, Config.GetWebHost(), TeamPort);
Thread.currentThread().join();
}
case "teamserver-cli" -> {
String TeamHost = Arg(Args, "-ts", "-thost", "127.0.0.1");
int TeamPort = ParseInt(Arg(Args, "-tp", "-tport", String.valueOf(Config.GetTeamServerPort())), Config.GetTeamServerPort());
new com.raven.interfaces.TeamClient(Config, TeamHost, TeamPort).Run();
}
case "teamserver-gui" -> GUI.LaunchTeam(Config);
case "teamserver-web" -> {
int TeamPort = ParseInt(Arg(Args, "-tp", "-tport", String.valueOf(Config.GetTeamServerPort())), Config.GetTeamServerPort());
new TeamServer(Config, Mode).Run(Config.GetWebHost(), TeamPort);
Thread.currentThread().join();
}
case "web" -> {
int WebPort = ParseInt(Arg(Args, "-wp", "-web-port", String.valueOf(Config.GetWebPort())), Config.GetWebPort());
new WebApp(Config, Mode).Run(Config.GetWebHost(), WebPort);
Thread.currentThread().join();
}
default -> {
new WebApp(Config, Mode).Run(Config.GetWebHost(), Config.GetWebPort());
int WebPort = ParseInt(Arg(Args, "-wp", "-web-port", String.valueOf(Config.GetWebPort())), Config.GetWebPort());
new WebApp(Config, Mode).Run(Config.GetWebHost(), WebPort);
Thread.currentThread().join();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import com.raven.interfaces.CLI.module.log.LogManager;
import com.raven.utils.ServerConfig;
import com.raven.utils.TerminalHelper;
import com.raven.utils.SystemHelper;
import java.util.ArrayList;
import java.util.List;

Expand Down Expand Up @@ -62,7 +63,7 @@ public DispatchResult Dispatch(String Command, String[] Parts) {
}
case "help" -> OperatorCommands.ShowHelp();
case "clean" -> {
TerminalHelper.Clear();
SystemHelper.ClearScreen();
return DispatchResult.UpdateLastCount;
}
case "sessions", "agents" -> SessionCommands.ShowSessions();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

public final class ExportCommand {

private static final DateTimeFormatter FileFmt = DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss");
private static final DateTimeFormatter LogFmt = com.raven.utils.RavenConstants.TimestampFmt;
private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();
private static final Path OUT_DIR = Paths.get("exports");
Expand Down Expand Up @@ -138,7 +137,7 @@ private void Write(String Name, Format F, List<Map<String, Object>> Data) {
}

private void WriteRaw(String Name, String Ext, String Content) {
String Filename = Name + "_" + LocalDateTime.now().format(FileFmt) + "." + Ext;
String Filename = Name + "_" + LocalDateTime.now().format(com.raven.utils.RavenConstants.FilenameFmt) + "." + Ext;
Path File = OUT_DIR.resolve(Filename);
try {
Files.writeString(File, Content);
Expand Down
4 changes: 2 additions & 2 deletions RAVEN/src/main/java/com/raven/core/server/BaseServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,8 +31,8 @@

public abstract class BaseServer {

protected static final byte[] EndMarker = "<END>".getBytes();
protected static final byte[] MetaMarker = "<META>".getBytes();
protected static final byte[] EndMarker = "<END>".getBytes(java.nio.charset.StandardCharsets.UTF_8);
protected static final byte[] MetaMarker = "<META>".getBytes(java.nio.charset.StandardCharsets.UTF_8);
protected static final Gson Gson = new Gson();
protected static final int MinFrameBytes = 12 + 16;

Expand Down
45 changes: 19 additions & 26 deletions RAVEN/src/main/java/com/raven/interfaces/CLI/CLI.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.raven.interfaces.CLI;

import com.raven.utils.Helper;

import com.raven.core.command.AgentCommandDispatcher;
import com.raven.core.command.AgentCommandDispatcher.CommandResult;
import com.raven.core.command.CommandRegistry;
Expand Down Expand Up @@ -242,7 +244,7 @@ private int Dispatch(String Cmd, String[] P) {
}
case "help" -> ShowHelp();
case "clean" -> {
TerminalHelper.Clear();
SystemHelper.ClearScreen();
return 1;
}
case "status" -> {
Expand Down Expand Up @@ -272,7 +274,7 @@ private int Dispatch(String Cmd, String[] P) {
}
case "webstart" -> {
String WebHost = P.length > 1 ? P[1] : Config.GetWebHost();
int WebPort = P.length > 2 ? ParseIntSafe(P[2], Config.GetWebPort()) : Config.GetWebPort();
int WebPort = P.length > 2 ? Helper.ParseInt(P[2], Config.GetWebPort()) : Config.GetWebPort();
WebPanelManager.Start(WebHost, WebPort, Server, ServerStartTime);
}
case "webstop" -> WebPanelManager.Stop();
Expand Down Expand Up @@ -426,12 +428,12 @@ private int Dispatch(String Cmd, String[] P) {
}
}
case "history" -> {
int AgentId = P.length > 1 ? ParseIntSafe(P[1], 0) : 0;
int Limit = P.length > 2 ? ParseIntSafe(P[2], 50) : 50;
int AgentId = P.length > 1 ? Helper.ParseInt(P[1], 0) : 0;
int Limit = P.length > 2 ? Helper.ParseInt(P[2], 50) : 50;
ShowCommandHistory(AgentId, Limit);
}
case "sessions-history", "sesshistory" -> {
int Limit = P.length > 1 ? ParseIntSafe(P[1], 50) : 50;
int Limit = P.length > 1 ? Helper.ParseInt(P[1], 50) : 50;
List<Map<String, Object>> Sessions = Db.GetSessionHistory(Limit);
System.out.println(TerminalHelper.Box("SESSION HISTORY (last " + Limit + ")"));
System.out.println();
Expand Down Expand Up @@ -656,18 +658,9 @@ private int Dispatch(String Cmd, String[] P) {
}
String SaveName = P[1];
String SaveDesc = P.length > 2 ? BuildArgs(P, 2) : "";
Map<String, String> CurrentSettings = new java.util.LinkedHashMap<>();
CurrentSettings.put("operator.name", OperatorName != null ? OperatorName : "");
CurrentSettings.put("operator.role", OperatorRole != null ? OperatorRole.name() : "MEMBER");
CurrentSettings.put("operator.theme", "dark");
CurrentSettings.put("operator.output.box", "true");
CurrentSettings.put("operator.output.timestamp", "true");
CurrentSettings.put("operator.session.log.limit", "100");
CurrentSettings.put("operator.history.limit", "50");
CurrentSettings.put("operator.auto.reconnect", "true");
CurrentSettings.put("operator.chat.notify", "true");
CurrentSettings.put("operator.broadcast.confirm", "true");
CurrentSettings.put("operator.selfdestruct.confirm", "true");
Map<String, String> CurrentSettings = new java.util.LinkedHashMap<>(OperatorCfg.ToMap());
if (OperatorName != null) CurrentSettings.put("operator.name", OperatorName);
if (OperatorRole != null) CurrentSettings.put("operator.role", OperatorRole.name());
if (ProfileManager.Save(SaveName, CurrentSettings, SaveDesc)) Logger.Custom(" %s✔ profile saved: %s%s%n%n", AnsiColor.Green, SaveName, AnsiColor.Reset);
else Logger.Error("failed to save profile: " + SaveName);
}
Expand Down Expand Up @@ -854,7 +847,7 @@ private void Interactive(int Id) {
String Input = Reader.readLine();
if (Input == null || Input.equalsIgnoreCase("back") || Input.equalsIgnoreCase("exit")) break;
if (Input.isBlank()) continue;
if (Input.trim().equalsIgnoreCase("clean")) { TerminalHelper.Clear(); continue; }
if (Input.trim().equalsIgnoreCase("clean")) { SystemHelper.ClearScreen(); continue; }
Execute(Id, Input);
} catch (IOException Ex) {
break;
Expand Down Expand Up @@ -942,12 +935,12 @@ private void ShowChat() {
return;
}
for (Map<String, Object> M : Msgs) {
String From = M.getOrDefault("from_operator", "?").toString();
String To = M.getOrDefault("to_operators", "all").toString();
String Ts = M.getOrDefault("timestamp", "").toString();
String From = M.getOrDefault("From", "?").toString();
String To = M.getOrDefault("To", "all").toString();
String Ts = M.getOrDefault("Timestamp", "").toString();
if (Ts.length() > 19) Ts = Ts.substring(11, 19);
boolean Mine = From.equals(OperatorName);
Logger.Custom(" %s[%s] %s%s%s [%s]: %s%s%n", Mine ? AnsiColor.Green : AnsiColor.White, Ts, Mine ? AnsiColor.Green : AnsiColor.Red, From, AnsiColor.Reset, To.equals("all") ? "all" : "→ " + To, M.getOrDefault("message", ""), AnsiColor.Reset);
Logger.Custom(" %s[%s] %s%s%s [%s]: %s%s%n", Mine ? AnsiColor.Green : AnsiColor.White, Ts, Mine ? AnsiColor.Green : AnsiColor.Red, From, AnsiColor.Reset, To.equals("all") ? "all" : "→ " + To, M.getOrDefault("Message", ""), AnsiColor.Reset);
}
System.out.println();
}
Expand All @@ -962,12 +955,12 @@ private void ShowChatHistory(int Limit) {
return;
}
for (Map<String, Object> M : Msgs) {
String From = M.getOrDefault("from_operator", "?").toString();
String To = M.getOrDefault("to_operators", "all").toString();
String Ts = M.getOrDefault("timestamp", "").toString();
String From = M.getOrDefault("From", "?").toString();
String To = M.getOrDefault("To", "all").toString();
String Ts = M.getOrDefault("Timestamp", "").toString();
if (Ts.length() > 19) Ts = Ts.substring(11, 19);
boolean Mine = From.equals(OperatorName);
Logger.Custom(" %s[%s] %s%s%s [%s]: %s%s%n", Mine ? AnsiColor.Green : AnsiColor.White, Ts, Mine ? AnsiColor.Green : AnsiColor.Red, From, AnsiColor.Reset, To.equals("all") ? "all" : "→ " + To, M.getOrDefault("message", ""), AnsiColor.Reset);
Logger.Custom(" %s[%s] %s%s%s [%s]: %s%s%n", Mine ? AnsiColor.Green : AnsiColor.White, Ts, Mine ? AnsiColor.Green : AnsiColor.Red, From, AnsiColor.Reset, To.equals("all") ? "all" : "→ " + To, M.getOrDefault("Message", ""), AnsiColor.Reset);
}
System.out.println();
}
Expand Down
Loading
Loading