Skip to content

Commit

Permalink
Havoc Framework 0.4
Browse files Browse the repository at this point in the history
  • Loading branch information
Cracked5pider committed Nov 15, 2022
1 parent 3ea96fb commit d98f8b6
Show file tree
Hide file tree
Showing 70 changed files with 9,531 additions and 6,532 deletions.
6 changes: 5 additions & 1 deletion Client/Include/Havoc/DemonCmdDispatch.h
Expand Up @@ -40,6 +40,8 @@ enum class Commands {
CONFIG = 2500,
SCREENSHOT = 2510,
PIVOT = 2520,
TRANSFER = 2530,
SOCKET = 2540,

OUTPUT = 90,
ERROR = 91,
Expand All @@ -51,7 +53,7 @@ class DispatchOutput
public:
HavocSpace::DemonCommands* DemonCommandInstance;

auto MessageOutput( QString JsonString, const QString& Date ) -> void;
auto MessageOutput( QString JsonString, const QString& Date ) const -> void;
};

class CommandExecute
Expand All @@ -64,6 +66,8 @@ class CommandExecute
auto Checkin( QString TaskID ) -> void;
auto Job( QString TaskID, QString SubCommand, QString Argument ) -> void;
auto FS( const QString& TaskID, QString SubCommand, QString Arguments ) -> void;
auto Transfer( const QString& TaskID, QString SubCommand, QString FileID ) -> void;
auto Socket( const QString& TaskID, QString SubCommand, QString Params ) -> void;

auto ProcModule( QString TaskID, int SubCommand, QString Args ) -> void;
auto ProcList( QString TaskID, bool FromProcessManager ) -> void;
Expand Down
2 changes: 2 additions & 0 deletions Client/Include/UserInterface/Widgets/DemonInteracted.h
Expand Up @@ -30,6 +30,8 @@ namespace HavocNamespace::UserInterface::Widgets
QStringList CommandHistory;
explicit DemonInput(QWidget *parent = nullptr);

void AddCommand( const QString& Command );

protected:
bool event(QEvent *) override;
};
Expand Down
12 changes: 7 additions & 5 deletions Client/Source/Havoc/Demon/CommandOutput.cpp
Expand Up @@ -12,7 +12,7 @@

using namespace HavocNamespace::HavocSpace;

void DispatchOutput::MessageOutput( QString JsonString, const QString& Date = "" )
void DispatchOutput::MessageOutput( QString JsonString, const QString& Date = "" ) const
{
auto JsonDocument = QJsonDocument::fromJson( QByteArray::fromBase64( JsonString.toLocal8Bit( ) ) );
auto MessageType = JsonDocument[ "Type" ].toString();
Expand All @@ -21,14 +21,16 @@ void DispatchOutput::MessageOutput( QString JsonString, const QString& Date = ""

if ( Message.length() > 0 )
{
if ( MessageType == "Error" )
if ( MessageType == "Error" || MessageType == "Erro" )
this->DemonCommandInstance->DemonConsole->TaskError( Message );
else if ( MessageType == "Good" )
this->DemonCommandInstance->DemonConsole->AppendRaw( Util::ColorText::Green( "[+]" ) + " " + Message.toHtmlEscaped() );
this->DemonCommandInstance->DemonConsole->AppendRaw( Util::ColorText::Green( "[+]" ) + " " + Message );
else if ( MessageType == "Info" )
this->DemonCommandInstance->DemonConsole->AppendRaw( Util::ColorText::Cyan( "[*]" ) + " " + Message.toHtmlEscaped() );
this->DemonCommandInstance->DemonConsole->AppendRaw( Util::ColorText::Cyan( "[*]" ) + " " + Message );
else if ( MessageType == "Warning" || MessageType == "Warn" )
this->DemonCommandInstance->DemonConsole->AppendRaw( Util::ColorText::Yellow( "[!]" ) + " " + Message );
else
this->DemonCommandInstance->DemonConsole->AppendRaw( Util::ColorText::Purple( "[^]" ) + " " + Message.toHtmlEscaped() );
this->DemonCommandInstance->DemonConsole->AppendRaw( Util::ColorText::Purple( "[^]" ) + " " + Message );
}

if ( ! Output.isEmpty() )
Expand Down
100 changes: 69 additions & 31 deletions Client/Source/Havoc/Demon/CommandSend.cpp
Expand Up @@ -323,14 +323,14 @@ auto CommandExecute::Config( const QString& TaskID, const QString& Key, const QS
auto Body = Util::Packager::Body_t {
.SubEvent = Util::Packager::Session::SendCommand,
.Info = {
{ "TaskID", TaskID.toStdString() },
{ "DemonID", this->DemonCommandInstance->DemonConsole->SessionInfo.Name.toStdString() },
{ "TaskID", TaskID.toStdString() },
{ "DemonID", this->DemonCommandInstance->DemonConsole->SessionInfo.Name.toStdString() },

{ "CommandID", to_string( (int)Commands::CONFIG ).c_str() },
{ "CommandLine", DemonCommandInstance->CommandInputList[ TaskID ].toStdString() },
{ "CommandID", to_string( (int)Commands::CONFIG ).c_str() },
{ "CommandLine", DemonCommandInstance->CommandInputList[ TaskID ].toStdString() },

{ "ConfigKey", Key.toStdString() },
{ "ConfigVal", Value.toStdString() },
{ "ConfigKey", Key.toStdString() },
{ "ConfigVal", Value.toStdString() },
},
};

Expand All @@ -342,11 +342,11 @@ auto CommandExecute::Screenshot( const QString &TaskID ) -> void
auto Body = Util::Packager::Body_t {
.SubEvent = Util::Packager::Session::SendCommand,
.Info = {
{ "TaskID", TaskID.toStdString() },
{ "DemonID", this->DemonCommandInstance->DemonConsole->SessionInfo.Name.toStdString() },
{ "TaskID", TaskID.toStdString() },
{ "DemonID", this->DemonCommandInstance->DemonConsole->SessionInfo.Name.toStdString() },

{ "CommandID", to_string( ( int ) Commands::SCREENSHOT ).c_str() },
{ "CommandLine", DemonCommandInstance->CommandInputList[ TaskID ].toStdString() },
{ "CommandID", to_string( ( int ) Commands::SCREENSHOT ).c_str() },
{ "CommandLine", DemonCommandInstance->CommandInputList[ TaskID ].toStdString() },
},
};

Expand All @@ -358,14 +358,14 @@ auto CommandExecute::Net( QString TaskID, QString Command, QString Param ) -> vo
auto Body = Util::Packager::Body_t {
.SubEvent = Util::Packager::Session::SendCommand,
.Info = {
{ "TaskID", TaskID.toStdString() },
{ "DemonID", this->DemonCommandInstance->DemonConsole->SessionInfo.Name.toStdString() },
{ "TaskID", TaskID.toStdString() },
{ "DemonID", this->DemonCommandInstance->DemonConsole->SessionInfo.Name.toStdString() },

{ "CommandID", to_string( ( int ) Commands::NET ).c_str() },
{ "CommandLine", DemonCommandInstance->CommandInputList[ TaskID ].toStdString() },
{ "CommandID", to_string( ( int ) Commands::NET ).c_str() },
{ "CommandLine", DemonCommandInstance->CommandInputList[ TaskID ].toStdString() },

{ "NetCommand", Command.toStdString() },
{ "Param", Param.toStdString() },
{ "NetCommand", Command.toStdString() },
{ "Param", Param.toStdString() },
},
};

Expand All @@ -377,14 +377,14 @@ auto CommandExecute::Pivot( QString TaskID, QString Command, QString Param ) ->
auto Body = Util::Packager::Body_t {
.SubEvent = Util::Packager::Session::SendCommand,
.Info = {
{ "TaskID", TaskID.toStdString() },
{ "DemonID", this->DemonCommandInstance->DemonConsole->SessionInfo.Name.toStdString() },
{ "TaskID", TaskID.toStdString() },
{ "DemonID", this->DemonCommandInstance->DemonConsole->SessionInfo.Name.toStdString() },

{ "CommandID", to_string( ( int ) Commands::PIVOT ).c_str() },
{ "CommandLine", DemonCommandInstance->CommandInputList[ TaskID ].toStdString() },
{ "CommandID", to_string( ( int ) Commands::PIVOT ).c_str() },
{ "CommandLine", DemonCommandInstance->CommandInputList[ TaskID ].toStdString() },

{ "Command", Command.toStdString() },
{ "Param", Param.toStdString() },
{ "Command", Command.toStdString() },
{ "Param", Param.toStdString() },
},
};

Expand All @@ -406,32 +406,70 @@ auto CommandExecute::Job( QString TaskID, QString SubCommand, QString Argument )
auto Body = Util::Packager::Body_t {
.SubEvent = Util::Packager::Session::SendCommand,
.Info = {
{ "TaskID", TaskID.toStdString() },
{ "DemonID", this->DemonCommandInstance->DemonConsole->SessionInfo.Name.toStdString() },
{ "TaskID", TaskID.toStdString() },
{ "DemonID", this->DemonCommandInstance->DemonConsole->SessionInfo.Name.toStdString() },

{ "CommandID", to_string( ( int ) Commands::JOB ).c_str() },
{ "CommandLine", DemonCommandInstance->CommandInputList[ TaskID ].toStdString() },
{ "CommandID", to_string( ( int ) Commands::JOB ).c_str() },
{ "CommandLine", DemonCommandInstance->CommandInputList[ TaskID ].toStdString() },

{ "Command", SubCommand.toStdString() },
{ "Param", Argument.toStdString() },
{ "Command", SubCommand.toStdString() },
{ "Param", Argument.toStdString() },
},
};

NewPackageCommand( this->DemonCommandInstance->Teamserver, Body );
}

auto CommandExecute::Task( const QString& TaskID, const QString& Command ) -> void
{
auto Body = Util::Packager::Body_t {
.SubEvent = Util::Packager::Session::SendCommand,
.Info = {
{ "TaskID", TaskID.toStdString() },
{ "DemonID", this->DemonCommandInstance->DemonConsole->SessionInfo.Name.toStdString() },
{ "CommandID", "Teamserver" },
{ "CommandLine", DemonCommandInstance->CommandInputList[ TaskID ].toStdString() },
{ "Command", Command.toStdString() },
},
};

NewPackageCommand( this->DemonCommandInstance->Teamserver, Body );
}

auto CommandExecute::Transfer( const QString &TaskID, QString SubCommand, QString Arguments ) -> void
{
auto Body = Util::Packager::Body_t {
.SubEvent = Util::Packager::Session::SendCommand,
.Info = {
{ "TaskID", TaskID.toStdString() },
{ "DemonID", this->DemonCommandInstance->DemonConsole->SessionInfo.Name.toStdString() },

{ "CommandID", to_string( ( int ) Commands::TRANSFER ).c_str() },
{ "CommandLine", DemonCommandInstance->CommandInputList[ TaskID ].toStdString() },

{ "Command", SubCommand.toStdString() },
{ "FileID", Arguments.toStdString() },
},
};

NewPackageCommand( DemonCommandInstance->Teamserver, Body );
}

auto CommandExecute::Socket( const QString &TaskID, QString SubCommand, QString Arguments ) -> void
{
auto Body = Util::Packager::Body_t {
.SubEvent = Util::Packager::Session::SendCommand,
.Info = {
{ "TaskID", TaskID.toStdString() },
{ "DemonID", this->DemonCommandInstance->DemonConsole->SessionInfo.Name.toStdString() },
{ "CommandID", "Teamserver" },

{ "CommandID", to_string( ( int ) Commands::SOCKET ).c_str() },
{ "CommandLine", DemonCommandInstance->CommandInputList[ TaskID ].toStdString() },
{ "Command", Command.toStdString() },

{ "Command", SubCommand.toStdString() },
{ "Params", Arguments.toStdString() },
},
};

NewPackageCommand( this->DemonCommandInstance->Teamserver, Body );
NewPackageCommand( DemonCommandInstance->Teamserver, Body );
}
83 changes: 71 additions & 12 deletions Client/Source/Havoc/Demon/Commands.cpp
Expand Up @@ -142,6 +142,44 @@ std::vector<DemonCommands::Command_t> DemonCommands::DemonCommandList = {
},
},
},
{
.CommandString = "transfer",
.Description = "download transfer module",
.Behavior = BEHAVIOR_API_ONLY,
.Usage = "<subcommand>",
.Example = "list",
.SubCommands =
{
{
.CommandString = "list",
.Description = "list current downloads",
.Behavior = BEHAVIOR_API_ONLY,
.Usage = "",
.Example = "",
},
{
.CommandString = "stop",
.Description = "stops a download",
.Behavior = BEHAVIOR_API_ONLY,
.Usage = "<FileID>",
.Example = "ffff",
},
{
.CommandString = "resume",
.Description = "resumes a download",
.Behavior = BEHAVIOR_API_ONLY,
.Usage = "<FileID>",
.Example = "ffff",
},
{
.CommandString = "remove",
.Description = "stops and removes a download",
.Behavior = BEHAVIOR_API_ONLY,
.Usage = "<FileID>",
.Example = "ffff",
},
}
},
{
.CommandString = "dir",
.Description = "list specified directory",
Expand Down Expand Up @@ -364,12 +402,6 @@ std::vector<DemonCommands::Command_t> DemonCommands::DemonCommandList = {
.Usage = "[Domain] [Username] [Password] ",
.Example = "domain.local Administrator Passw0rd@1234",
},
{
.CommandString = "privs-get",
.Description = "try to enable all/specified privileges from current token",
.Behavior = BEHAVIOR_API_ONLY,
.MitreTechniques = { "T1134" },
},
{
.CommandString = "privs-list",
.Description = "list all privileges from current token",
Expand Down Expand Up @@ -609,10 +641,37 @@ std::vector<DemonCommands::Command_t> DemonCommands::DemonCommandList = {
},
},
},
/*{
.CommandString = "jump-exec",
.Description = "lateral movement module",
.Usage = "[exploit] (args)",
.Module = true,
},*/
{
.CommandString = "rportfwd",
.Description = "reverse port forwarding",
.Usage = "[sub command] (args)",
.Example = "add 0.0.0.0 8080 192.157.0.1 4444",
.SubCommands =
{
{
.CommandString = "add",
.Description = "add an reverse port forward",
.Behavior = BEHAVIOR_API_ONLY,
.Usage = "[bind host] [bind port] [forward host] [forward port]",
.Example = "0.0.0.0 8080 192.157.0.1 4444",
},
{
.CommandString = "list",
.Description = "list all reverse port forwards",
.Behavior = BEHAVIOR_API_ONLY,
},
{
.CommandString = "remove",
.Description = "close and remove a reverse port forward",
.Behavior = BEHAVIOR_API_ONLY,
.Usage = "[Socket ID]",
.Example = R"(b4bbb42)",
},
{
.CommandString = "clear",
.Description = "close and clear all reverse port forwards",
.Behavior = BEHAVIOR_API_ONLY,
},
},
},
};

0 comments on commit d98f8b6

Please sign in to comment.