|
|
开篇絮语
$ i" V3 M5 Z, j* {- [% M" M# J; n a3 M [5 W% |5 l7 x2 ^
为了进一步增强NetScreen防火墙用户的安全防范能力,为了提高经常光顾我们网站的朋友们的网络安全知识水平,我们将陆续把NetScreen能够防范的一些网络攻击手段的攻击原理在这个新增的栏目里介绍给大家,希望你在这里有所收获,如果你有什么想法请到我们网站的安全论坛来发表,对于新的攻击手段我们的资料不是很全,如果你很了解这方面的情况请发表在论坛上或者与我们联系。
' a: J* Q* i" D4 a k- _* `$ X+ W3 @% A
俗话说魔高一尺,道高一丈。为了适应网络攻防技术的不断变化,为了预防将要产生的新型攻击手段,NetScreen公司在将要发布的NetScreenOS3.1*系统中将增加13种防攻击手段,现在所有可防范的网络攻击手段它们如下所列:Syn Attach(同步攻击)、ICMP flood(ICMP泛滥)、UDP flood(UDP泛滥)、Ping of death(死亡ping)、IP spoofing(IP欺骗)、Port Scan(端口扫描)、Land attack(陆地攻击)、Tear drop attack(撕毁攻击)、Filter IP source route option(过滤IP源路由选项)、IP address sweep option(IP地址扫描攻击)、WinNuke attack(WinNuke攻击)、Java/ActiveX/ZIP/EXE()、Default packet deny(预设封包拒绝)、User-defined Malicious URL(用户可预设的恶意URL)、Per-source session limiting(每源口的会话限制)、:Syn fragments(同步碎片)、Syn and Fin bit set(Syn和Fin位设置(bit set))、No flags in TCP(TCP无标记)、FIN with no ACK(无确认FIN)、ICMP fragments(ICMP碎片)、Large ICMP(大型ICMP)、IP source route(IP始发路由)、IP record route(IP记录路由)、IP security options(IP安全选项)、IP timestamp(IP时间戳)、IP stream(IP流)、IP bad options(IP损害选项)、Unknown protocols(不明协议).在这个栏目里,我们将对这些攻击手段的攻击原理进行详细介绍。' A" Q' i+ Z9 O# P1 S, ~; k
- w2 x$ T7 ]6 t2 `*(现在的NetScreenOS的版本为3.0,NetScreen204和NetScreen208出厂设置均为OS3.1,其他产品都可以升级到3.1,但特别老的型号不行,这里请广大用户注意,如不了解情况请及时与我公司工程师咨询)' @% ]- o& V2 M, ~7 V5 y, ~
1 e/ T9 K. W" j& k! I* z( A, u
DOS攻击原理以及常见方法介绍(--其中详细介绍了SYN Flood和IP spoofing(IP欺骗)的攻击基本原理)$ Y: S: S2 U! J* D, d: j9 s
文章作者:Refdom& `$ b; Y5 L' n. V* N6 d$ V
. @ a& T m2 O3 ^- d( i' k, M) ^
( s3 X; L& F2 j6 ~具体内容:( S& G B4 p$ @0 G
6 P! T, F! T* Z 已经有很多介绍DOS(Denial of Service,即拒绝服务)攻击的文章,但是,多数人还是不知道DOS到底是什么,它到底是怎么实现的。本文主要介绍DOS的机理和常见的实施方法。因前段时间仔细了解了TCP/IP协议以及RFC文档,有点心得。同时,文中有部分内容参考了Shaft的文章翻译而得。要想了解DOS攻击得实现机理,必须对TCP有一定的了解。 ' r- R# {3 H) `7 r( W G
4 A% V" X. v8 U$ C9 N# |; P `
1、什么是DOS攻击 6 N2 ?& X/ W: s9 I) {" F5 w
DOS:即Denial Of Service,拒绝服务的缩写,可不能认为是微软的dos操作系统了。好象在5·1的时候闹过这样的笑话。拒绝服务,就相当于必胜客在客满的时候不再让人进去一样,呵呵,你想吃馅饼,就必须在门口等吧。DOS攻击即让目标机器停止提供服务或资源访问。 1 ^ z5 v1 t4 o9 j3 X) k( F' y
* T; c3 J8 p4 o2 }# g4 V" z+ Z
2、有关TCP协议的东西
+ C# Z5 n: x/ {5 y1 I TCP(transmission control protocol,传输控制协议),是用来在不可靠的因特网上提供可靠的、端到端的字节流通讯协议,在RFC793中有正式定义,还有一些解决错误的东西在RFC 1122中有记录,RFC 1323则有TCP的功能扩展。我们常见到的TCP/IP协议中,IP层不保证将数据报正确传送到目的地,TCP则从本地机器接受用户的数据流,将其分成不超过64K字节的数据片段,将每个数据片段作为单独的IP数据包发送出去,最后在目的地机器中再组合成完整的字节流,TCP协议必须保证可靠性。发送和接收方的TCP传输以数据段的形式交换数据,一个数据段包括一个固定的20字节,加上可选部分,后面再跟上数据,TCP协议从发送方传送一个数据段的时候,还要启动计时器,当数据段到达目的地后,接收方还要发送回一个数据段,其中有一个确认序号,它等于希望收到的下一个数据段的顺序号,如果计时器在确认信息到达前超时了,发送方会重新发送这个数据段。 5 N! j) c6 o+ W% W3 P
?$ a: O- l9 _" T# v; J& R 上面,我们总体上了解一点TCP协议,重要的是要熟悉TCP的数据头(header)。因为数据流的传输最重要的就是header里面的东西,至于发送的数据,只是header附带上的。客户端和服务端的服务响应就是同header里面的数据相关,两端的信息交流和交换是根据header中的内容实施的,因此,要实现DOS,就必须对header中的内容非常熟悉。
$ J/ c; k. O3 ^9 ~0 l% f% D3 u$ @2 \( D( z* u
下面是TCP数据段头格式。RFC793中的
; d! a# V. z$ z r0 u- ^3 [, \5 J% e; H0 |
7 @6 Y5 K' L1 Q* d$ } _( c 0 1 2 3
% C4 H( F1 v/ i+ X 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - C$ k" {( _( ?8 c) W" D* H
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
. Y, a% K4 @6 |7 G" D | Source Port | Destination Port | 8 P: x2 p N Y. m! e* c) J3 O
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
, p8 N L1 _3 }! L: H' j6 N | Sequence Number | 5 P3 U4 O a0 X7 \. q
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
' G$ N' x% Y. q- k) t) g | Acknowledgment Number | " `. V# b) Q( n* \0 F9 S
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
0 R6 H5 Q( B1 d9 P8 i6 H) _7 d4 _* U. B- H | Data | |U|A|P|R|S|F| | " b( Y5 U4 j/ G2 s
| Offset| Reserved |R|C|S|S|Y|I| Window |
7 ]+ ~& Q. R# w# L* U0 T | | |G|K|H|T|N|N| |
; t/ V2 o# Z4 Q G, q0 p) G/ `& B +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ; L0 i2 y1 C$ O
| Checksum | Urgent Pointer | 6 i" V! D7 W) x- R2 D, x$ w
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
( O# I9 b2 B! ~2 U( a | Options | Padding |
: `/ ]6 o& {4 S' Z. u8 P4 L +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 8 R7 m9 j2 }+ k* c o- f' Q
| data | ) a) E* [ B2 m" _ t
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ C# d2 U8 R. Q V2 A: ?8 I: x8 b) o V
TCP Header Format
7 T8 {& X+ s7 m0 E
& q2 n" [; e2 t3 h7 w1 u+ W5 J. P' \. p" k; m
Source Port和 Destination Port :是本地端口和目标端口 % \8 m/ p2 _( W. J5 a$ g+ m g
Sequence Number 和 Acknowledgment Number :是顺序号和确认号,确认号是希望接收的字节号。这都是32位的,在TCP流中,每个数据字节都被编号。 5 ^2 y! ?& b; r+ p
Data offset :表明TCP头包含多少个32位字,用来确定头的长度,因为头中可选字段长度是不定的。 ; j" O) b, d$ v. t
Reserved : 保留的6位,现在没用,都是0
/ J l/ L1 l2 V T; F& `# J/ ]6 {; U! t2 Y
接下来是6个1位的标志,这是两个计算机数据交流的信息标志。接收和发送断根据这些标志来确定信息流的种类。下面是一些介绍: 6 l6 q. Q% ]8 b7 ?5 B3 l
URG:(Urgent Pointer field significant)紧急指针。用到的时候值为1,用来处理避免TCP数据流中断
7 D2 K9 J8 ^, F5 T ACK:(Acknowledgment field significant)置1时表示确认号(Acknowledgment Number)为合法,为0的时候表示数据段不包含确认信息,确认号被忽略。 9 `- t2 O! a% }* T1 W
PSH:(Push Function),PUSH标志的数据,置1时请求的数据段在接收方得到后就可直接送到应用程序,而不必等到缓冲区满时才传送。 % f0 D0 ?6 N5 a
RST:(Reset the connection)用于复位因某种原因引起出现的错误连接,也用来拒绝非法数据和请求。如果接收到RST位时候,通常发生了某些错误。
' j' C) H' K$ s4 |1 ? SYN:(Synchronize sequence numbers)用来建立连接,在连接请求中,SYN=1,ACK=0,连接响应时,SYN=1,ACK=1。即,SYN和ACK来区分Connection Request和Connection Accepted。
3 P/ F" Y8 Y% T/ ~8 u FIN:(No more data from sender)用来释放连接,表明发送方已经没有数据发送了。
, }" n5 W5 x O) ?" T" c/ T3 R7 h. t+ v; d
知道这重要的6个指示标志后,我们继续来。 $ }6 @7 d$ e7 [6 x
; K" f0 K2 V+ _) S 16位的WINDOW字段:表示确认了字节后还可以发送多少字节。可以为0,表示已经收到包括确认号减1(即已发送所有数据)在内的所有数据段。 / I* X& q( q$ ^
接下来是16位的Checksum字段,用来确保可靠性的。 . } h; N; n6 K% n5 o- H8 J* v
16位的Urgent Pointer,和下面的字段我们这里不解释了。不然太多了。呵呵,偷懒啊。
6 j6 Z* e/ ~ M: g) Z' z% B; e, y, u" z. c1 _) v7 l" I
我们进入比较重要的一部分:TCP连接握手过程。这个过程简单地分为三步。 ) z/ D' |3 V" b5 W7 G& N. K, a
) D# y* D' n4 \3 p7 R7 s
在没有连接中,接受方(我们针对服务器),服务器处于LISTEN状态,等待其他机器发送连接请求。 : L! v& \2 J9 q# I; t
% Y* t1 D( ?; E+ K- y0 @# N
第一步:客户端发送一个带SYN位的请求,向服务器表示需要连接,比如发送包假设请求序号为10,那么则为:SYN=10,ACK=0,然后等待服务器的响应。 3 q; q4 e; ^7 s6 D& Q: J9 D% d5 f
( F. g6 x; R, r- N; |$ j2 M9 R3 S第二步:服务器接收到这样的请求后,查看是否在LISTEN的是指定的端口,不然,就发送RST=1应答,拒绝建立连接。如果接收连接,那么服务器发送确认,SYN为服务器的一个内码,假设为100,ACK位则是客户端的请求序号加1,本例中发送的数据是:SYN=100,ACK=11,用这样的数据发送给客户端。向客户端表示,服务器连接已经准备好了,等待客户端的确认 ' X# w1 U3 U9 ^% D( `
这时客户端接收到消息后,分析得到的信息,准备发送确认连接信号到服务器
* e4 P/ E4 K8 ?- e6 D8 ?# O+ ^第三步:客户端发送确认建立连接的消息给服务器。确认信息的SYN位是服务器发送的ACK位,ACK位是服务器发送的SYN位加1。即:SYN=11,ACK=101。
- l+ u7 d6 N( F6 E3 A# K! A% N4 o Y9 x& F% |( u2 w( I6 E8 K8 V
这时,连接已经建立起来了。然后发送数据?lt;SYN=11,ACK=101><DATA>。这是一个基本的请求和连接过程。需要注意的是这些标志位的关系,比如SYN、ACK。
0 C# J3 y0 {5 Q3 z5 y) t: V
3 N3 `( o2 ^3 `( n" p% N3、服务器的缓冲区队列(Backlog Queue) + |9 O0 M) g9 R+ R" A; I& Q' K: _7 B
服务器不会在每次接收到SYN请求就立刻同客户端建立连接,而是为连接请求分配内存空间,建立会话,并放到一个等待队列中。如果,这个等待的队列已经满了,那么,服务器就不在为新的连接分配任何东西,直接丢弃新的请求。如果到了这样的地步,服务器就是拒绝服务了。 h3 o4 _! C6 m/ C- g# Q0 o1 {
如果服务器接收到一个RST位信息,那么就认为这是一个有错误的数据段,会根据客户端IP,把这样的连接在缓冲区队列中清除掉。这对IP欺骗有影响,也能被利用来做DOS攻击。 ( z2 U. {, h4 g2 p" r2 O
; \) O9 s$ w6 y! t8 I
####################################################################
# C% c4 V1 R8 W3 @& J& Q( e$ a
$ }9 n! Z# l9 |6 [& L 上面的介绍,我们了解TCP协议,以及连接过程。要对SERVER实施拒绝服务攻击,实质上的方式就是有两个:
$ \% f) D4 \& ]$ M一,迫使服务器的缓冲区满,不接收新的请求。
3 A/ P5 s- P, C1 u二,使用IP欺骗,迫使服务器把合法用户的连接复位,影响合法用户的连接这就是DOS攻击实施的基本思想。具体实现有这样的方法: : l! A$ ]- w$ a( O S1 s2 B4 d8 k
; o" M% O* j1 w/ F7 g' a$ a, t1、SYN FLOOD $ E# B: R: A9 d- o
利用服务器的连接缓冲区(Backlog Queue),利用特殊的程序,设置TCP的Header,向服务器端不断地成倍发送只有SYN标志的TCP连接请求。当服务器接收的时候,都认为是没有建立起来的连接请求,于是为这些请求建立会话,排到缓冲区队列中。 % U8 m' @" }7 ^5 G0 X+ [
如果你的SYN请求超过了服务器能容纳的限度,缓冲区队列满,那么服务器就不再接收新的请求了。其他合法用户的连接都被拒绝掉。可以持续你的SYN请求发送,直到缓冲区中都是你的只有SYN标记的请求。现在有很多实施SYN FLOOD的工具,呵呵,自己找去吧。 2 m$ M& A/ R, s4 W
5 [; i3 _3 n( j7 B; [. H2、IP欺骗DOS攻击
- x, B, i6 [' y, r! U X4 G# \# K 这种攻击利用RST位来实现。假设现在有一个合法用户(1.1.1.1)已经同服务器建立了正常的连接,攻击者构造攻击的TCP数据,伪装自己的IP为1.1.1.1,并向服务器发送一个带有RST位的TCP数据段。服务器接收到这样的数据后,认为从1.1.1.1发送的连接有错误,就会清空缓冲区中建立好的连接。这时,如果合法用户1.1.1.1再发送合法数据,服务器就已经没有这样的连接了,该用户就必须从新开始建立连接。
i! L' g6 C" p/ Q; L6 a* {5 R 攻击时,伪造大量的IP地址,向目标发送RST数据,使服务器不对合法用户服务。 0 |! v4 Q; g$ F* I
: z! [) @- m! i \$ u5 Y' W; C
3、带宽DOS攻击 % t1 n6 {+ \0 A
如果你的连接带宽足够大而服务器又不是很大,你可以发送请求,来消耗服务器的缓冲区消耗服务器的带宽。这种攻击就是人多力量大了,配合上SYN一起实施DOS,威力巨大。不过是初级DOS攻击。呵呵。Ping白宫??你发疯了啊!
1 v" z8 O- l6 b4 n, g3 b7 Y# T+ |+ E6 q7 M* h8 y
4、自身消耗的DOS攻击
5 K# H: R4 M% a! t 这是一种老式的攻击手法。说老式,是因为老式的系统有这样的自身BUG。比如Win95 (winsock v1), Cisco IOS v.10.x, 和其他过时的系统。
: ^+ s9 M& k5 q( b2 n0 U 这种DOS攻击就是把请求客户端IP和端口弄成主机的IP端口相同,发送给主机。使得主机给自己发送TCP请求和连接。这种主机的漏洞会很快把资源消耗光。直接导致当机。这种伪装对一些身份认证系统还是威胁巨大的。
: Q( a0 T# K/ J0 T( r1 C! P
5 b* g" b0 Z2 ? m3 H! s 实施DOS攻击最主要的就是构造需要的TCP数据,充分利用TCP协议。这些攻击方法都是建立在TCP基础上的。当然还有更多的实施方法,可以自己去研究。 # _) g1 H: a# H8 s
; u {6 \1 J( {$ \' @/ |4 N
再加深了解一下SYN Flood的基本原理: F F8 G9 H$ S
; X9 f' d, J0 g* ~, {! S3 _
SYN Flood是当前最流行的DoS(拒绝服务攻击)与DdoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,从而使得被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。0 {/ v# i' O7 W; ^( n' l' S: v' I
3 c2 M$ X& \/ x( _
要明白这种攻击的基本原理,还是要从TCP连接建立的过程开始说起:
) \4 y# s- S& y( Z5 y3 s2 v) ]1 @" h! G, d
大家都知道,TCP与UDP不同,它是基于连接的,也就是说:为了在服务端和客户端之间传送TCP数据,必须先建立一个虚拟电路,也就是TCP连接,建立TCP连接的标准过程是这样的:
. u4 B B) E# q# ~3 O. l3 `; e, d7 o) U2 B8 P9 l) z
) Y/ q* V ]( D 首先,请求端(客户端)发送一个包含SYN标志的TCP报文,SYN即同步(Synchronize),同步报文会指明客户端使用的端口以及TCP连接的初始序号;
* K& w# E9 r5 }4 F& U8 D; z2 M3 U) g
第二步,服务器在收到客户端的SYN报文后,将返回一个SYN+ACK的报文,表示客户端的请求被接受,同时TCP序号被加一,ACK即确认(Acknowledgement)。
9 a+ N! g5 d s8 a0 v' X9 T+ N9 r* B( j6 Y4 G
第三步,客户端也返回一个确认报文ACK给服务器端,同样TCP序列号被加一,到此一个TCP连接完成。
5 U2 O7 Z- C6 Y6 t' c8 L/ q6 H以上的连接过程在TCP协议中被称为三次握手(Three-way Handshake)。
4 T2 b3 ?3 |9 C& Q/ E: R8 H1 U4 K
问题就出在TCP连接的三次握手中,假设一个用户向服务器发送了SYN报文后突然死机或掉线,那么服务器在发出SYN+ACK应答报文后是无法收到客户端的ACK报文的(第三次握手无法完成),这种情况下服务器端一般会重试(再次发送SYN+ACK给客户端)并等待一段时间后丢弃这个未完成的连接,这段时间的长度我们称为SYN Timeout,一般来说这个时间是分钟的数量级(大约为30秒-2分钟);一个用户出现异常导致服务器的一个线程等待1分钟并不是什么很大的问题,但如果有一个恶意的攻击者大量模拟这种情况,服务器端将为了维护一个非常大的半连接列表而消耗非常多的资源----数以万计的半连接,即使是简单的保存并遍历也会消耗非常多的CPU时间和内存,何况还要不断对这个列表中的IP进行SYN+ACK的重试。实际上如果服务器的TCP/IP栈不够强大,最后的结果往往是堆栈溢出崩溃---即使服务器端的系统足够强大,服务器端也将忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况我们称作:服务器端受到了SYN Flood攻击(SYN洪水攻击)。 |
|