当前位置:在线查询网 > 在线百科全书查询 > TCP/IP攻击

TCP/IP攻击_在线百科全书查询


请输入要查询的词条内容:

TCP/IP攻击


由于TCP/IP协议是Internet的基础协议,所以对TCP/IP协议的完善和改进是非常必要的。TCP/IP协议从开始设计时候并没有考虑到现在网络上如此多的威胁,由此导致了许多形形色色的攻击方法,一般针对协议原理的攻击(尤其是DDOS)我们无能为力。现将TCP/IP攻击的常用原理介绍如下:

(1) 源地址欺骗(Source Address Spoofing)、IP欺骗(IP Spoofing)和DNS欺骗(DNS Spoofing).其基本原理:是利用IP地址并不是出厂的时候与MAC固定在一起的,攻击者通过自封包和修改网络节点的IP地址,冒充某个可信节点的IP地址,进行攻击。主要有三种手法:

1. 瘫痪真正拥有IP的可信主机,伪装可信主机攻击服务器;

2. 中间人攻击;

3. DNS欺骗(DNS Spoofing)和“会话劫持”(Session Hijack);

(2) 源路由选择欺骗(Source Routing Spoofing)。原理:利用IP数据包中的一个选项-IP Source Routing来指定路由,利用可信用户对服务器进行攻击,特别是基于UDP协议的由于其是面向非连接的,更容易被利用来攻击;

(3) 路由选择信息协议攻击(RIP Attacks)。原理:攻击者在网上发布假的路由信息,再通过ICMP重定向来欺骗服务器路由器和主机,将正常的路由器标志为失效,从而达到攻击的目的。

(4) TCP序列号欺骗和攻击(TCP Sequence Number Spoofing and Attack),基本有三种:

1. 伪造TCP序列号,构造一个伪装的TCP封包,对网络上可信主机进行攻击;

2. SYN攻击(SYN Attack)。这类攻击手法花样很多,蔚为大观。但是其原理基本一致,让TCP协议无法完成三次握手协议;

3. Teardrop攻击(Teardrop Attack)和Land攻击(Land Attack)。原理:利用系统接收IP数据包,对数据包长度和偏移不严格的漏洞进行的。

IP攻击方式

0 x4 u'' R. ^% j) c'' o2 z6 o2 t+ {( _1.OOB攻击

& J( l& |# g'' `'' n! z# B7 L. M 这是利用NETBIOS中一个OOB(Out of Band)的漏洞而来进行的,它的原理是通过TCP/IP协议传递一个数据包到计算机某个开放的端口上(一般是137、138和139),当计算机收到这个数据包之后就会瞬间死机或者蓝屏现象,不重新启动计算机就无法继续使用TCP/IP协议来访问网络。

- L! A9 d+ t, D9 a2 c'' t 2.DoS攻击# m1 @- d4 B% w6 |/ A4 G* U5 k

这是针对Windows 9X所使用的ICMP协议进行的DOS(Denial of Service,拒绝服务)攻击,一般来说,这种攻击是利用对方计算机上所安装协议的漏洞来连续发送大量的数据包,造成对方计算机的死机。$ n& U O2 v'' ~

3.WinNuke攻击

* M'' ^: [ y& E& Z7 Y$ e X; n, ? 目前的WinNuke系列工具已经从最初的简单选择IP攻击某个端口发展到可以攻击一个IP区间范围的计算机,并且可以进行连续攻击,还能够验证攻击的效果,还可以对检测和选择端口,所以使用它可以造成某一个IP地址区间的计算机全部蓝屏死机。

; ^7 ]1 G, Y! v# @$ ]8 b6 E* ]& ] 4.SSPing

, J/ _5 S" k% K4 x, K9 } 这是一个IP攻击工具,它的工作原理是向对方的计算机连续发出大型的ICMP数据包,被攻击的机器此时会试图将这些文件包合并处理,从而造成系统死机。$ T L" i- p: s

5.TearDrop攻击

) c; m& v( v'' X) A6 N& J4 b. N* I 这种攻击方式利用那些在TCP/IP堆栈实现中信任IP碎片中的包的标题头所包含的信息来实现自己的攻击,由于IP分段中含有指示该分段所包含的是原包哪一段的信息,所以一些操作系统下的TCP/IP协议在收到含有重叠偏移的伪造分段时将崩溃。TeadDrop最大的特点是除了能够对Windows 9X/NT进行攻击之外,连Linux也不能幸免。2 f+ L) x# m1 J) Y6 U

$ q; S L: O2 z4 r$ B

9 b3 M- o. D) ^TCP/IP攻击原理9 ^- _1 G9 x. u. p" i6 E( {

利用协议实现的攻击方法,都是故意错误地设定数据包头的一些重要字段,例如,IP包头部的Total / u& a! [+ {0 l4 s3 {

Length、Fragment offset、IHL和Source address等字段。使用Raw Socket将这些错误的IP数据包发送出去。在接受数据端,接收程序通常都存在一些问题,因而在将接受到的数据包组装成一个完整的数据包的过程中,就会使系统当机、挂起或系统崩溃。 # w$ q7 X$ l! B* Y/ l. G'' w3 I! O" }

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

; ]) M/ w. N! G0 ?$ s+ Q3 V在本章,我们将结合一些程序来讨论这种攻击能够实施的原理的同时,读者也可以使用这些程序来检查自己系统针对这类攻击的安全程度,并采取相应的措施。 ; {8 J) j% d) ~7 _! }* L. Z

1 攻击的现象及其后果 % U, @9 P |$ Y- k8 L# b

使用了Windows 95和Windows 98 NT的人们都经历过系统陷入混乱,对任何输入都没有响应的情况。这时候,屏幕出现蓝屏,迟迟无法重新刷新。按下Ctrl+Alt+Del时,看到系统CPU利用率达到100%,同时显示一个应用程序无响应。这是程序出错或者使用了盗版软件的缘故。

( r; @" L8 N( x: X( @* u通过网络,也可以使正在使用的计算机出现这种无响应、死机的现象。事实上,大量的程序往往经不住人们恶意的攻击。

: h6 U. [+ O7 n; e/ N0 }* Q! o4 o人们已经使用了许多方法来专门对付上网的Windows 95和Windows NT。目前,能够对Windows 95和Windows NT进行攻击的方法很多,当前流行的有:tearDrop(也称为“泪滴”)、OOB、Land和Ping of Death等。其中,关于Ping of Death在缓冲区溢出一章中对这种攻击做了介绍,并给出了一些对策。 # B$ M! E2 @7 o) c

一般的攻击过程是这样的:当入侵者发现了一台Windows 95或者Windows NT(这只需用端口扫描工具扫一 ) s2 o# P0 y( `9 t1 C'' h

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

实上,这些攻击并不是局限于Windows NT和Windows 95平台,一些攻击,如Land已被发现对Linux、Cisco % U0 K2 V$ n) g* G2 H* {. [2 l

路由器以及其他大量的UNIX操作系统都具有相当的攻击能力。 ; U% f$ a( u; R9 `0 z* G

能够实施这种攻击的原因是在Windows 95和Windows NT中存在错误,这是一种处理TCP/IP协议或者服务程 . S- ~% Q& {& v9 Z" T1 O. f

序的错误。人们利用这些错误。通过给端口送一些故意弄错的数据包,在这个数据包的偏移字段和长度字 6 S# w ? |) i) Z$ g8 s

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

# j! i+ ~9 o, L# W蓝屏,Windows NT是非死机不可。据称TearDrop可以使被攻击的主机立刻当机。 ( F3 T0 a" q" a( [, k/ ^( G9 ^* x( Q

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

/ P ~% T) o5 k2 k/ ]Linux操作系统主机时,只需启动这一程序,输入入口参数假冒IP、端口号,被攻击主机的IP地址和端口号, ) m: ?5 l4 ^8 Q

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

( D u3 S9 Q2 x5 g用ping命令,被攻击的主机就再也没有回应了。

& o8 r4 `9 ^, o7 a9 ?5 r服务程序存在错误的情况是很多的,例如,Windows NT中的RPC服务存在漏洞。某个用户可以远程登录到 " z1 ?. T8 V7 ?/ Q6 `. e- ]# L1 v

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

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

6 l5 }; Q9 y/ i全的重要隐患并严重地影响系统性能。 H7 Q+ ]3 k6 T

对于OOB攻击,人们已经提出一些对策,如在Windows NT 4.0 中,呆以对发到端口若悬河39的包进行过滤 & r'' M( A. G, X/ }$ F

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

: y; a7 l* l7 n'' @, v1 ~- A目前网上已经出现补丁程序,用来对付这些攻击方法的攻击。在 Windows 95和Windows NT上的安装非常 + N/ g'' _- C0 ^6 d

简单,只需运行一下安装包即可。 9 t" d" M4 q/ y" z, H. @; A+ I

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

2 F+ {3 s" S& K1 M* N3 q口发出数据包,同时禁止数据包发向本主机的所有端口时,实际上已将本主机应用层的服务功能和访问功 - A# e8 U ]2 D T5 d( t% r

能切断。此时,虽然可以ping通一台有帐户和口令的UNIX主机,但却地法登上(telnet)该主机或从该主 3 [1 Y2 m- P2 r7 @4 P

机用ftp取回文件。 7 {4 d6 t u4 X'' n4 v- I( s1 \\2 w'' u

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

; w) E8 Q0 o. u% P) m- } V2 泪滴(TearDrop)攻击工具

, n: u- C$ s2 d$ | [这个攻击工具起名为泪滴,它确实可以让人们恨得咬牙切齿。 6 n& B# E/ `) c; k+ D

当辛苦的劳动成果突然因为一次莫名其妙的当机而化为乌有。也许,这次当机便是一个人随意地向你的计 6 t: g: q, Z'' d- R

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

) P6 D! v8 Q/ m2 ~这个攻击利用的是系统在实现时的一个错误,我们以Linux上的一个实现为例,也就是说,某些Linux操作 2 p6 v# I1 y: X1 ]& W; H

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

2 t) \\, q( b+ L! g2 aLinux操作系统在它的IP数据包重装模块有一个严重的错误,更确切一点地说,是在ip-glue()函数中。

# k9 v8 r3 G7 h% O当Linux收到一个个IP包,送到IP层进行组装,以形成发送端原来的IP包时,它将进入了一个循环中,将

9 P. d* ^3 S3 Q7 A* u0 T接收队列中的一个个数据包中的有效数据,拷贝到一个新分配的缓冲区中。

9 H$ [. @% O& {这段代码如下:

& d# v6 A5 O( Bfp = qp->fragments; & S- h1 z( r'' d1 j4 |$ K. {

while (fp ! =NULL) 2 e9 Z: J7 @2 |/ A" p'' J

{

8 M& r/ N. T# N4 L5 Wif (count +fp ->len >skb ->len)] : a* d* J'' a0 u" ]6 f$ s/ d

{ 3 x B) B: y! D1 k5 u'' [" A2 {

error-to-big; # j4 G+ D2 K7 B! [* ^; J

}

% A6 d2 [: F* f# D- nmemcpy (ptr + fp ->offaet ), fp-> ptr, fp->len);

6 h- l6 A- x6 ]5 z- O1 b. L1 t, Ecount +=fp ->len;

- Z* _/ }- [- |$ `% B, k: o6 Rfp =fp->next;

8 ?0 [: m, r8 `2 g* y8 J) F+ y} + N; z4 t7 o" p5 R

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

3 h'' I" s# \\ |4 O# R1 W- f* _8 P发生某种危险。然而在程序中并没有检查包中有效数据的长度是否过分小,例如,当表示包中数据长度 / l- K& q1 J; i T$ P

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

8 P8 T/ I'' x: r# |拷贝到内核中去。 / j4 p3 s" s" S2 D! p6 V N

以下,让我们看看Linux是如何将收到的IP数据加入到组装队列中去的。 4 n2 @4 O'' J- M0 T

计算这一fragmrnt的终结位置: ! z'' c1 O4 z& c: u8 p'' X

/* ; {) q/ |) X# B" t

l Determine the position of this fragmrment. 3 @'' G1 h- M7 i& y/ V

l /

9 ?, A( B) e$ \\end =offset +ntohs(iph ->tot-len) –ihl; ; Q$ v o/ P, @

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

1 e! c4 |" u" |'' p段交叠在一起,会发生什么呢? . m% W( K# @# E- t" R'' o

看看程序对“fragment offset”做了那些处理: . I4 U$ K5 B! K3 B

if (prev != NULL&& offset

% F, S'' c" ?2 Y; m8 n- l" P q{

. F( }'' S+ y/ Z. z4 I1 t: rI =prev->end –offset;

) I4 {8 [# o0 ]8 MOffset +=I : /*ptr into datagram */

3 ^# i( U6 t% u; NPtr += I /* ptr into fragment data */ 7 h) I& R3 X: Q

} * R# Z4 i( {7 F6 N# @, ^$ Z( J

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

分有重叠。组装程序试图正确对齐它们的边界。程序代码如上所示。这一步是对的。除非当前包中的有 3 M( G9 O: }! D# f8 ~

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

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

2 b'' H g( T8 G: ^& `/* Fill in the structure. */

7 ~/ R2 V/ h3 R% F5 v* K! _% Ifp->offset =offset; _5 D% h& k/ m V# w- c$ E: m

fp->end =end;

; x, n'' E0 @, }/ {! O4 [; |0 mfp->len =end –offset; % y; F$ Y* c1 A( k8 ] {4 Z

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

5 f9 G( t7 R$ _3 @2 v% P# g+ M& S# y到内核中,因为memcpy()中的记数器是一个反码,是一个非常大的数值。根据使用的内存管理机制的不同,

8 x; n2 \\'' z8 i& q$ A- ?# o& [将会引起系统重启动或停机。 / r7 i0 E; H0 ^3 t

这种情况完全可以通过编程来实现,例如可以发送两个特殊的数据包,第一个包中的“offset”域置为0, ( D; I5 Z/ Z; c) O( H

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

0 p3 n; }( p/ n& a9 _2 K4 Q- ?9 uIP数据也少于N。 " o& [) V1 z% P$ k- n3 ~; q& H

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

1 M% k'' G+ ]" w'' f5 Xnext->offset * }# z'' l( y) e& \\4 d

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

g9 D! B, B5 N$ g'' pcur ->end =next ->offest +(next->iph ->tot-len)-ihl);

- @6 y; v5 I S'' o; Icur ->len =cur->end-cur->offest; 2 m6 B! w5 R# R. k: \\; A2 B

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

. A2 A: s+ P) G- b* L负数。 ( M3 T% @# a, X# G/ _! w

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

$ S3 [* N( e( V. z3 j意的情况下,那就一定会发生的。

0 M4 p, d2 y! O, p人们可以自己编写发送raw数据包的程序。在数据包中,从IP包头开始,都可以填入自己想要的任意数值。 " m$ i: N+ K) q+ P'' s! U* m# T) } w% Y

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

4 t8 n. e+ y. X! L会发现这种错误。

5 ?! m7 `3 `" \\, h. g2 u1 E8 z当前的许多Linux的实现中都有这个错误,向Linux发送很少几个这样的数据包,便可以引起Linux当机, 0 A% L0 `5 F! p/ A, m

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

, q0 x8 v9 g/ f4 u+ c9 F. Y; qWindows NT发送10-15个这样的包,也会引起死机。 / n! C3 V# z8 a/ y& K0 U; K

现在在网上已经出现了大量类似这样的程序,这些攻击的方法依然是对一些字段使用错误的值,但和 * s9 @) V" W. X8 t1 m0 D: [

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

两倍。

相关分词: TCP IP 攻击