惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

The Last Watchdog
The Last Watchdog
K
Kaspersky official blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Spread Privacy
Spread Privacy
T
Threatpost
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
MongoDB | Blog
MongoDB | Blog
V
Vulnerabilities – Threatpost
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Help Net Security
Help Net Security
Microsoft Azure Blog
Microsoft Azure Blog
GbyAI
GbyAI
小众软件
小众软件
Cloudbric
Cloudbric
The Hacker News
The Hacker News
阮一峰的网络日志
阮一峰的网络日志
Vercel News
Vercel News
人人都是产品经理
人人都是产品经理
Forbes - Security
Forbes - Security
Martin Fowler
Martin Fowler
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
AWS News Blog
AWS News Blog
Stack Overflow Blog
Stack Overflow Blog
N
News | PayPal Newsroom
P
Privacy & Cybersecurity Law Blog
TaoSecurity Blog
TaoSecurity Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
博客园_首页
A
Arctic Wolf
www.infosecurity-magazine.com
www.infosecurity-magazine.com
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
Scott Helme
Scott Helme
T
Tor Project blog
S
Secure Thoughts
Know Your Adversary
Know Your Adversary
P
Proofpoint News Feed
M
MIT News - Artificial intelligence
博客园 - 司徒正美
T
Threat Research - Cisco Blogs
C
Cyber Attacks, Cyber Crime and Cyber Security
Schneier on Security
Schneier on Security
B
Blog RSS Feed
AI
AI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Attack and Defense Labs
Attack and Defense Labs
Webroot Blog
Webroot Blog
Google DeepMind News
Google DeepMind News
Project Zero
Project Zero
Hacker News: Ask HN
Hacker News: Ask HN

博客园 - 三毛

VS2008 中无法使用ACTIVEX控件的解决 - 三毛 - 博客园 #pragma pack(push,1)与#pragma pack(1)的区别 由HEAP Corruption DETECTED查到的 Run-Time Check Failure #N [转]在MFC中的文档视图中对视图使用RichEdit2--来自CodeGuru 关于CStdioFile奇怪的"错误" [转]利用处理程序错误攻击(下) [转]TCP/IP攻击原理分析总结 ACE学习笔记--持续更新中 - 三毛 - 博客园 [转]VC使用CRT调试功能来检测内存泄漏 [转]RSA算法简介 IOCP学习笔记 解决:Can't connect to local MySQL server through socket LINUX学习笔记:在Linux中设置IP地址 在MySQL中级联删除数据 NHibernate笔记 MySQL学习笔记 [转]洗衣除渍的窍门 [转]中国街头骗术大全 ---------------------献给经验不足的朋友
[转]利用处理程序错误攻击(上)
三毛 · 2007-05-08 · via 博客园 - 三毛

文章属性:转载
文章提交:xundi (xundi_at_xfocus.org)

在本章,将要介绍一些利用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端口的程序改造为可以攻击一系列端口。