找回密码
 注册

QQ登录

只需一步,快速开始

IP欺骗的技术

[复制链接]
发表于 2011-1-13 17:01:50 | 显示全部楼层 |阅读模式
$ x! Q) w7 l8 ]& S* K
IP欺骗的技术比较复杂,不是简单地照猫画老虎就能掌握,但作为常规攻击手段,有必要理解其原理,至少有利于自己的安全防范,易守难攻嘛。
" c3 r" V7 T7 X5 v9 ?2 f4 e- E/ p1 y
2 p. ]* B8 R1 c; o假设B上的客户运行rlogin与A上的rlogind通信:
. _6 P. f. S- u9 \% ~, \: _9 m
1. B发送带有SYN标志的数据段通知A需要建立TCP连接。并将TCP报头中的sequence number设置成自己本次连接的初始值ISN。 ) j5 u+ U* F' _( }$ ~$ J9 h  v

7 a2 F, \9 k3 R3 J# f! f8 H* r2. A回传给B一个带有SYS+ACK标志的数据段,告之自己的ISN,并确认B发送来的第一个数据段,将acknowledge number设置成B的ISN+1。 $ X/ Y' d: s( N' j! ^

" u8 Z" j' G  `: z3 A5 N3. B确认收到的A的数据段,将acknowledge number设置成A的ISN+1。 0 |4 E5 n! S; `- p  i" S7 T

5 d" `+ o( z" z% ~7 w3 `# K# LB ---- SYN ----> A
% f8 e- f. \0 n- K/ i4 g2 m" UB <---- SYN+ACK A 4 e% Z! v! b8 p" z: e3 @
B ---- ACK ----> A
5 [! ^  H8 e" N7 D3 X; w: ]/ N& j
( u& b5 d# k1 R! p) ]8 ^TCP使用的sequence number是一个32位的计数器,从0-4294967295。TCP为每一个连接选择一个初始序号ISN,为了防止因为延迟、重传等扰乱三次握手,ISN不能随便选取,不同系统有不同算法。理解TCP如何分配ISN以及ISN随时间变化的规律,对于成功地进行IP欺骗攻击很重要。 " B( Z/ _* ^" T/ |; n( L; a3 X3 F# L

; e( [6 F0 ]5 q4 `/ M3 g基于远程过程调用RPC的命令,比如rlogin、rcp、rsh等等,根据/etc/hosts.equiv以及$HOME/.rhosts文件进行安全校验,其实质是仅仅根据信源IP地址进行用户身份确认,以便允许或拒绝用户RPC。关于上述两个文件请man,不喜欢看英文就去Unix版看看我以前灌过的一瓢水。
( a: y! {+ c' }0 F( }3 c( t! n6 }, m* ^$ x4 s+ ~
IP欺骗攻击的描述:
4 x$ L7 d; C8 L& a; X6 u" p4 @( H: k( p
1. 假设Z企图攻击A,而A信任B,所谓信任指/etc/hosts.equiv和$HOME/.rhosts中有相关设置。注意,如何才能知道A信任B呢?没有什么确切的办法。我的建议就是平时注意搜集蛛丝 , t2 O2 X$ I6 |6 q! n4 f
马迹,厚积薄发。一次成功的攻击其实主要不是因为技术上的高明,而是因为信息搜集的广泛翔实。动用了自以为很有成就感的技术,却不比人家酒桌上的巧妙提问,攻击只以成功为终极目标,不在乎手段。
1 f- L' x8 k9 [1 d; W5 n. A/ {7 }* q) v
2. 假设Z已经知道了被信任的B,应该想办法使B的网络功能暂时瘫痪,以免对攻击造成干扰。著名的SYN flood常常是一次IP欺骗攻击的前奏。请看一个并发服务器的框架: ! @7 k( D9 Y9 E+ i+ G/ `; t
" P6 p* Y7 ^8 E/ _7 C1 |
int initsockid, newsockid;
& d+ g, |3 B7 M  ~- Oif ((initsockid = socket(...)) <0) { 6 V% Z2 ?& W4 N! I+ ?& Y, q/ s. h
error("can't create socket"); 4 H  f- d5 ?8 [6 o3 |( S8 R6 ~. q
}
3 N: ^' U. P. L5 C5 V. V5 wif (bind(initsockid, ...) <0) {
6 H2 ?! g& l& Eerror("bind error"); 3 p4 I: R) |2 P3 q; W* l7 @8 q
} $ D' C* j+ k: O  {, P
if (listen(initsockid, 5) <0) { 0 `4 K! R8 G! s( X9 m
error("listen error");
0 j1 a, X+ u, m2 L& @}
/ n0 G: q2 X5 a. K$ Lfor (;;) { ! ]' @( P- p: j* n( y
newsockid = accept(initsockid, ...); /* 阻塞 */
% L( r: T7 H" @8 g9 E+ Hif (newsockid <0) { 4 e" O& E5 o( J
error("accept error");
1 [# Q; ]$ v6 l; Z}
# z! c( r. {4 W& _; V$ x6 Pif (fork() == 0) { /* 子进程 */ % y7 K2 y" r4 c; ]; t3 i- F, g
close(initsockid);
1 h, v* c+ l8 E. t% l# |do(newsockid); /* 处理客户方请求 */
) t: e3 R0 g- G$ T$ q" |, Fexit(0); 4 k& Y: R: T& t+ N, l9 }+ E
} ( L3 o/ D+ P( j, d9 i* Q5 Q% U
close(newsockid);
# R' _; K2 M5 P}
& ^+ x% a7 w3 y* `2 N% G: ]; j
: g- g( X, [4 e$ glisten函数中第二个参数是5,意思是在initsockid上允许的最大连接请求数目。如果某个时刻initsockid上的连接请求数目已经达到5,后续到达initsockid的连接请求将被TCP丢弃。注意一旦连接通过三次握手建立完成,accept调用已经处理这个连接,则TCP连接请求队列空出一个位置。所以这个5不是指initsockid上只能接受5个连接请求。SYN flood正是一种Denial of Service,导致B的网络功能暂 碧被尽?nbsp;
; r: j, ?2 k5 V  m- K. c, m! @& y; G; l4 |
Z向B发送多个带有SYN标志的数据段请求连接,注意将信源IP地址换成一个不存在的主机X;B向子虚乌有的X发送SYN+ACK数据段,但没有任何来自X的ACK出现。B的IP层会报告B的TCP层,X不可达,但B的TCP层对此不予理睬,认为只是暂时的。于是B在这个initsockid上再也不能接收正常的连接请求。
5 p" O9 u) `( L; {; N( q% j" H1 \5 z0 X
Z(X) ---- SYN ----> B
1 f  ?* F/ ~% y: h$ l& wZ(X) ---- SYN ----> B
4 x- m6 L# G& }! Z- |. JZ(X) ---- SYN ----> B
* [5 ?8 j! W, O9 _( t, S4 w- Z: nZ(X) ---- SYN ----> B
) ~0 Q. s" q3 SZ(X) ---- SYN ----> B ! U/ p9 z0 o! K
...... % u2 N6 X0 z; B# A- R9 f+ ?8 w
X <---- SYN+ACK B 7 [# [) D7 _1 P6 l: Y6 u+ c
X <---- SYN+ACK B * G! \* ?0 X# n+ p# Q0 I
X <---- SYN+ACK B ) P" j4 i* F/ B$ Z- \) C
X <---- SYN+ACK B
( q$ {7 X7 k& j3 z) q1 K1 q$ z0 [9 GX <---- SYN+ACK B
( i0 T& D, i, x8 d! I3 I2 X...... ) u, |% G! O) e' S

5 \9 ?$ Q( Z" J8 t9 [) a3 X( f作者认为这样就使得B网络功能暂时瘫痪,可我觉得好象不对头。因为B虽然在initsockid上无法接收TCP连接请求,但可以在another initsockid上接收,这种SYN flood应该只对特定的 $ _/ m" C7 Q+ X7 P
服务(端口),不应该影响到全局。当然如果不断地发送连接请求,就和用ping发洪水包一个道理,使得B的TCP/IP忙于处理负载增大。至于SYN flood,回头有机会我单独灌一瓢有关DoS的。如何使B的网络功能暂 碧被居 很多办法,根据具体情况而定,不再赘述。
" `, J. J( e+ }/ W6 A. P' R" |7 _2 @3 d! M9 }2 {- ^+ m
3. Z必须确定A当前的ISN。首先连向25端口(SMTP是没有安全校验机制的),与1中类似,不过这次需要记录A的ISN,以及Z到A的大致的RTT(round trip time)。这个步骤要重复多次以便求出 9 _, m9 [! C: X1 [5 Z# v
RTT的平均值。现在Z知道了A的ISN基值和增加规律(比如每秒增加128000,每次连接增加64000),也知道了从Z到A需要RTT/2的时间。必须立即进入攻击,否则在这之间有其他主机与A连接, 9 p% }9 t/ r. E8 {( v
ISN将比预料的多出64000。 % }9 [- _9 J! f, c6 m+ ^6 c& m

: N& p. d% K  n+ j: m. B! f4. Z向A发送带有SYN标志的数据段请求连接,只是信源IP改成了B,注意是针对TCP513端口(rlogin)。A向B回送SYN+ACK数据段,B已经无法响应(凭什么?按照作者在2中所说,估计还达不到这个效果,因为Z必然要模仿B发起connect调用,connect调用会完成全相关,自动指定本地socket地址和端口,可事实上B很可能并没有这样一个端口等待接收数据。除非Z模仿B发起 # v& D; H) n6 F2 p* W
连接请求时打破常规,主动在客户端调用bind函数,明确完成全相关,这样必然知道A会向B的某个端口回送,在2中也针对这个端口攻击B。可是如果这样,完全不用攻击B,bind的时候 , E& s& {- m. ]# \4 ~
指定一个B上根本不存在的端口即可。我也是想了又想,还没来得及看看老外的源代码,不妥之处有待商榷。总之,觉得作者好象在蒙我们,他自己也没有实践成功过吧。),B的TCP层只是
  Q4 L5 i; i+ l" e# x简单地丢弃A的回送数据段。
% t# u5 |( E  I8 |; _& T* a8 Y; G7 _6 ?
5. Z暂停一小会儿,让A有足够时间发送SYN+ACK,因为Z看不到这个包。然后Z再次伪装成B向A发送ACK,此时发送的数据段带有Z预测的A的ISN+1。如果预测准确,连接建立,数据传送开始。问题在于即使连接建立,A仍然会向B发送数据,而不是Z,Z仍然无法看到A发往B的数据段,Z必须蒙着头按照rlogin协议标准假冒B向A发送类似 "cat + + >> ~/.rhosts" 这样的命令,于是攻击完成。如果预测不准确,A将发送一个带有RST标志的数据段异常终止连接,Z只有从头再来。 ) [' ^4 O* a& H/ J" w
& A8 Q" u! Z8 _/ P! X
Z(B) ---- SYN ----> A ' `, Q# c7 O9 c4 R9 R) o
B <---- SYN+ACK A - p0 l4 ~) P( V: S# @
Z(B) ---- ACK ----> A
. G; ^3 y& ]% Y" l8 @4 M% yZ(B) ---- PSH ----> A
% c; q7 z8 }1 g7 Y6 |( d...... . V+ T/ T6 e" L8 [$ Z0 Z
1 o1 V" Z5 k- E8 g! ^; m; F+ l7 h
6. IP欺骗攻击利用了RPC服务器仅仅依赖于信源IP地址进行安全校验的特性,建议阅读rlogind的源代码。攻击最困难的地方在于预测A的ISN。作者认为攻击难度虽然大,但成功的可能性
- I* o/ i8 S- r( E$ g4 M. h也很大,不是很理解,似乎有点矛盾。考虑这种情况,入侵者控制了一台由A到B之间的路由器,假设Z就是这台路由器,那么A回送到B的数据段,现在Z是可以看到的,显然攻击难度
" x2 W% K- a; `0 M7 I& [7 g骤然下降了许多。否则Z必须精确地预见可能从A发往B的信息,以及A期待来自B的什么应答信息,这要求攻击者对协议本身相当熟悉。同时需要明白,这种攻击根本不可能在交互状态下完
! t# C3 J' h# ?6 Q成,必须写程序完成。当然在准备阶段可以用netxray之类的工具进行协议分析。
9 p$ M9 z. c8 g6 N# l3 i3 {( C, ]
- C1 K( E: j8 f8 T0 M6 Y7. 如果Z不是路由器,能否考虑组合使用ICMP重定向以及ARP欺骗等技术?没有仔细分析过,只是随便猜测而已。并且与A、B、Z之间具体的网络拓扑有密切关系,在某些情况下显然大幅度 & b" e9 Y9 U5 Y, N2 C  h$ b) `; ?
降低了攻击难度。注意IP欺骗攻击理论上是从广域网上发起的,不局限于局域网,这也正是这种攻击的魅力所在。利用IP欺骗攻击得到一个A上的shell,对于许多高级入侵者,得到目标主 * M5 A/ U3 o  M* ^3 `- a5 p
机的shell,离root权限就不远了,最容易想到的当然是接下来进行buffer overflow攻击。 9 j4 v; P+ h9 u0 |+ @( R5 E* S

+ y' m9 H$ L+ T& \9 z* @8. 也许有人要问,为什么Z不能直接把自己的IP设置成B的?这个问题很不好回答,要具体分析网络拓扑,当然也存在ARP冲突、出不了网关等问题。那么在IP欺骗攻击过程中是否存在ARP冲突问题。回想我前面贴过的ARP欺骗攻击,如果B的ARP Cache没有受到影响,就不会出现ARP冲突。如果Z向A发送数据段时,企图解析A的MAC地址或者路由器的MAC地址,必然会发送ARP请求包,但这个ARP请求包中源IP以及源MAC都是Z的,自然不会引起ARP冲突。而ARP Cache只会被ARP包改变,不受IP包的影响,所以可以肯定地说,IP欺骗攻击过程中不存在ARP冲突。相反,如果Z修改了自己的IP,这种ARP冲突就有可能出现,示具体情况而言。攻击中连带B一起攻击了,其目的无非是防止B干扰了攻击过程,如果B本身已经down掉,那是再好不过(是吗?)。
8 L7 ]" f' h2 @& _/ d2 G( k- G, l% X1 w$ E3 ~- O4 X& G+ A: G% V
9. fakeip曾经沸沸扬扬了一下,我对之进行端口扫描,发现其tcp端口113是接收入连接的。和IP欺骗等没有直接联系,和安全校验是有关系的。当然,这个东西并不如其名所暗示,对IP层没有任何动作。
( ]0 b$ b: A; {1 K) Z2 [: Z; ]- o& `2 m2 z( |  p: U. ]% L
10. 关于预测ISN,我想到另一个问题。就是如何以第三方身份切断A与B之间的TCP连接,实际上也是预测sequence number的问题。尝试过,也很困难。如果Z是A与B之间的路由器,就不用说了;或者Z动用了别的技术可以监听到A与B之间的通信,也容易些;否则预测太难。作者在3中提到连接A的25端口,可我想不明白的是513端口的ISN和25端口有什么关系?看来需要看看TCP/IP内部实现的源代码。 & A8 g; K7 \0 \7 f3 \' L* J8 s' g$ b
9 \$ n* Z9 B( P  j; P
未雨绸缪 , Q) A2 k* o3 C6 `2 L
9 N) p' p8 J( r: a5 |' l
虽然IP欺骗攻击有着相当难度,但我们应该清醒地意识到,这种攻击非常广泛,入侵往往由这里开始。预防这种攻击还是比较容易的,比如删除所有的/etc/hosts.equiv、$HOME/.rhosts文件,修改/etc/inetd.conf文件,使得RPC机制无法运做,还可以杀掉portmapper等等。设置路由器,过滤来自外部而信源地址却是内部IP的报文。cisio公司的产品就有这种功能。不过路由器只防得了外部入侵,内部入侵呢? 9 B4 V5 L' e$ J* D1 C0 m; G* ~0 q# B
% k. r! V- o- V* ^: [
TCP的ISN选择不是随机的,增加也不是随机的,这使攻击者有规可循,可以修改与ISN相关的代码,选择好的算法,使得攻击者难以找到规律。估计Linux下容易做到,那solaris、irix、hp-unix还有aix呢?sigh
+ g+ n& e3 p5 \5 _. F- z" p3 @1 n; X; U% w
虽然作者纸上谈兵,但总算让我们了解了一下IP欺骗攻击,我实验过预测sequence number,不是ISN,企图切断一个TCP连接,感觉难度很大。作者建议要找到规律,不要盲目预测,这需要时间和耐心。现在越发明白什么是那种锲而不舍永远追求的精神,我们所向往的传奇故事背后有着如此沉默的艰辛和毅力,但愿我们学会的是这个,而不是浮华与喧嚣。一个现成的bug足以让你取得root权限,可你在做什么,你是否明白?我们太肤浅了......
# K, ^" j" P* U. r; J
浅了......
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|本地广告联系: QQ:905790666 TEL:13176190456|Archiver|手机版|小黑屋|汶上信息港 ( 鲁ICP备19052200号-1 )

GMT+8, 2025-11-1 12:35

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表