Path: blob/master/DDOS Scripts/AMP YUBINA SCRIPTS/dns_amp_scanner_source.c
4607 views
#include <pthread.h>1#include <unistd.h>2#include <stdio.h>3#include <stdlib.h>4#include <string.h>5#include <sys/socket.h>6#include <netinet/in.h>7#include <signal.h>8#include <sys/time.h>9#include <sys/types.h>10#include <math.h>11#include <stropts.h>12#include <ctype.h>13#include <errno.h>14#include <arpa/inet.h>15#include <netinet/ip.h>16#include <netinet/udp.h>1718struct DNS_HEADER19{20unsigned short id; // identification number2122unsigned char rd :1; // recursion desired23unsigned char tc :1; // truncated message24unsigned char aa :1; // authoritive answer25unsigned char opcode :4; // purpose of message26unsigned char qr :1; // query/response flag2728unsigned char rcode :4; // response code29unsigned char cd :1; // checking disabled30unsigned char ad :1; // authenticated data31unsigned char z :1; // its z! reserved32unsigned char ra :1; // recursion available3334unsigned short q_count; // number of question entries35unsigned short ans_count; // number of answer entries36unsigned short auth_count; // number of authority entries37unsigned short add_count; // number of resource entries38};3940struct QUESTION41{42unsigned short qtype;43unsigned short qclass;44};4546#pragma pack(push, 1)47struct R_DATA48{49unsigned short type;50unsigned short _class;51unsigned int ttl;52unsigned short data_len;53};54#pragma pack(pop)5556struct RES_RECORD57{58unsigned char *name;59struct R_DATA *resource;60unsigned char *rdata;61};6263typedef struct64{65unsigned char *name;66struct QUESTION *ques;67} QUERY;6869volatile int running_threads = 0;70volatile int found_srvs = 0;71volatile unsigned long per_thread = 0;72volatile unsigned long start = 0;73volatile unsigned long scanned = 0;74volatile int sleep_between = 0;75volatile int bytes_sent = 0;76volatile unsigned long hosts_done = 0;77FILE *fd;7879void ChangetoDnsNameFormat(unsigned char* dns,unsigned char* host)80{81int lock = 0 , i;82strcat((char*)host,".");8384for(i = 0 ; i < strlen((char*)host) ; i++)85{86if(host[i]=='.')87{88*dns++ = i-lock;89for(;lock<i;lock++)90{91*dns++=host[lock];92}93lock++;94}95}96*dns++='\0';97}9899void *flood(void *par1)100{101running_threads++;102int thread_id = (int)par1;103unsigned long start_ip = htonl(ntohl(start)+(per_thread*thread_id));104unsigned long end = htonl(ntohl(start)+(per_thread*(thread_id+1)));105unsigned long w;106int y;107unsigned char *host = (unsigned char *)malloc(50);108strcpy((char *)host, ".");109unsigned char buf[65536],*qname;110struct DNS_HEADER *dns = NULL;111struct QUESTION *qinfo = NULL;112dns = (struct DNS_HEADER *)&buf;113114dns->id = (unsigned short) htons(rand());115dns->qr = 0;116dns->opcode = 0;117dns->aa = 0;118dns->tc = 0;119dns->rd = 1;120dns->ra = 0;121dns->z = 0;122dns->ad = 0;123dns->cd = 0;124dns->rcode = 0;125dns->q_count = htons(1);126dns->ans_count = 0;127dns->auth_count = 0;128dns->add_count = htons(1);129qname =(unsigned char*)&buf[sizeof(struct DNS_HEADER)];130131ChangetoDnsNameFormat(qname , host);132qinfo =(struct QUESTION*)&buf[sizeof(struct DNS_HEADER) + (strlen((const char*)qname) + 1)];133134qinfo->qtype = htons( 255 );135qinfo->qclass = htons(1);136137void *edns = (void *)qinfo + sizeof(struct QUESTION)+1;138memset(edns, 0x00, 1);139memset(edns+1, 0x29, 1);140memset(edns+2, 0xFF, 2);141memset(edns+4, 0x00, 7);142143int sizeofpayload = sizeof(struct DNS_HEADER) + (strlen((const char *)qname)+1) + sizeof(struct QUESTION) + 11;144int sock;145if((sock=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))<0) {146perror("cant open socket");147exit(-1);148}149for(w=ntohl(start_ip);w<htonl(end);w++)150{151struct sockaddr_in servaddr;152bzero(&servaddr, sizeof(servaddr));153servaddr.sin_family = AF_INET;154servaddr.sin_addr.s_addr=htonl(w);155servaddr.sin_port=htons(53);156sendto(sock,(char *)buf,sizeofpayload,0, (struct sockaddr *)&servaddr,sizeof(servaddr));157bytes_sent+=24;158scanned++;159hosts_done++;160usleep(sleep_between*1000);161}162close(sock);163running_threads--;164return;165}166167void sighandler(int sig)168{169fclose(fd);170printf("\n");171exit(0);172}173174void recievethread()175{176printf("Started Listening Thread\n");177int saddr_size, data_size, sock_raw;178struct sockaddr_in saddr;179struct in_addr in;180181unsigned char *buffer = (unsigned char *)malloc(65536);182sock_raw = socket(AF_INET , SOCK_RAW , IPPROTO_UDP);183if(sock_raw < 0)184{185printf("Socket Error\n");186exit(1);187}188while(1)189{190saddr_size = sizeof saddr;191data_size = recvfrom(sock_raw , buffer , 65536 , 0 , (struct sockaddr *)&saddr , &saddr_size);192if(data_size <0 )193{194printf("Recvfrom error , failed to get packets\n");195exit(1);196}197struct iphdr *iph = (struct iphdr*)buffer;198if(iph->protocol == 17)199{200unsigned short iphdrlen = iph->ihl*4;201struct udphdr *udph = (struct udphdr*)(buffer + iphdrlen);202unsigned char* payload = buffer + iphdrlen + 8;203if(ntohs(udph->source) == 53)204{205int body_length = data_size - iphdrlen - 8;206struct DNS_HEADER *dns = (struct DNS_HEADER*) payload;207if(dns->ra == 1)208{209found_srvs++;210fprintf(fd,"%s . %d\n",inet_ntoa(saddr.sin_addr),body_length);211fflush(fd);212}213}214}215216}217close(sock_raw);218219}220221int main(int argc, char *argv[ ])222{223224if(argc < 6){225fprintf(stderr, "Invalid parameters!\n");226fprintf(stdout, "Usage: %s <class a start> <class a end> <outfile> <threads> <scan delay in ms>\n", argv[0]);227exit(-1);228}229fd = fopen(argv[3], "a");230sleep_between = atoi(argv[5]);231232signal(SIGINT, &sighandler);233234int threads = atoi(argv[4]);235pthread_t thread;236237pthread_t listenthread;238pthread_create( &listenthread, NULL, &recievethread, NULL);239240char *str_start = malloc(18);241memset(str_start, 0, 18);242str_start = strcat(str_start,argv[1]);243str_start = strcat(str_start,".0.0.0");244char *str_end = malloc(18);245memset(str_end, 0, 18);246str_end = strcat(str_end,argv[2]);247str_end = strcat(str_end,".255.255.255");248start = inet_addr(str_start);249per_thread = (ntohl(inet_addr(str_end)) - ntohl(inet_addr(str_start))) / threads;250unsigned long toscan = (ntohl(inet_addr(str_end)) - ntohl(inet_addr(str_start)));251int i;252for(i = 0;i<threads;i++){253pthread_create( &thread, NULL, &flood, (void *) i);254}255sleep(1);256printf("Starting Scan...\n");257char *temp = (char *)malloc(17);258memset(temp, 0, 17);259sprintf(temp, "Found");260printf("%-16s", temp);261memset(temp, 0, 17);262sprintf(temp, "Host/s");263printf("%-16s", temp);264memset(temp, 0, 17);265sprintf(temp, "B/s");266printf("%-16s", temp);267memset(temp, 0, 17);268sprintf(temp, "Running Thrds");269printf("%-16s", temp);270memset(temp, 0, 17);271sprintf(temp, "Done");272printf("%s", temp);273printf("\n");274275char *new;276new = (char *)malloc(16*6);277while (running_threads > 0)278{279printf("\r");280memset(new, '\0', 16*6);281sprintf(new, "%s|%-15lu", new, found_srvs);282sprintf(new, "%s|%-15d", new, scanned);283sprintf(new, "%s|%-15d", new, bytes_sent);284sprintf(new, "%s|%-15d", new, running_threads);285memset(temp, 0, 17);286int percent_done=((double)(hosts_done)/(double)(toscan))*100;287sprintf(temp, "%d%%", percent_done);288sprintf(new, "%s|%s", new, temp);289printf("%s", new);290fflush(stdout);291bytes_sent=0;292scanned = 0;293sleep(1);294}295printf("\n");296fclose(fd);297return 0;298}299300