在剑盟看到的帖子,很值得玩味特此转来,建议新手就不用看了。1 v$ j5 X- V. y1 Y) x
1 `4 H' z8 ~4 @5 q: a5 W4 F8 a
# b9 u, `$ i# U9 k& R$ e( k& A) N3 G
............................................................................................................................................
9 H4 b8 i$ L1 t2 }( c0 `! ?; h% n/ p. o9 H( J" z, {
是谁控制了我们的浏览器?6 Z4 R! C3 v8 r2 K: W$ b1 o ?
1、现象是什么?" c4 A$ Z0 b3 } o6 i9 g( S
0 k* `, k _& J& O. e8 f; j C大约从今年年初开始,很多人就发现,在浏览一些网站的时候,
" E! W- G/ `2 @5 Z# H/ i地址栏的url后面会被莫名其妙地加上“?curtime=xxxxxxxxxx”(x为数字),并且弹出广告窗口。4 t) q) v/ ^5 ]' q5 i) a* {- k( [
很多人以为这是网站自己弹出的广告,也就没有在意。- k ]. t2 c3 Q9 @3 b3 A
2 i' C1 J* Q& r d( P8 _我是属于很在意的那些人之一。
3 e* d# F$ Z: K* R, q8 \/ J% H! o 4 S1 M+ `; V( Y3 w
2、这是怎么回事?; X/ @$ l. u0 L) o' F/ Y2 A
3 ~, Z5 q' v9 v9 I5 z5 u经过测试和分析,我们发现,上述现象与使用何种浏览器无关(我们测试了各种流行的http客户端),
5 ?$ F$ D7 R) z# w t; e3 f3 v与使用何种操作系统也无关(linux用户也有相关报告)。7 }: M' v4 v& s8 F4 a0 X# f
我对出现该现象的IE浏览器进程进行了跟踪调试,没有发现任何异常。可以断定,并不是系统被安装了adware或者spyware。+ J2 H7 k) z5 B$ r) x
& h/ ~( @* ?7 o' v
那么是不是那些网站自己做的呢?后来发现,访问我们自己管理的网站时也出现了这种情况,排除了这个可能。9 N* r3 E* J& g" G* I' u: w: E+ r R/ _
$ Y" }1 v. v1 G& w- o E3 p
那么剩下唯一的可能就是:有人在某个或某几个关键网络节点上安装了inject设备,) r, U3 W4 d8 M9 o/ [" c
劫持了我们的HTTP会话——我实在是不愿相信这个答案,这个无耻、龌龊的答案。
3 t* |) `7 G4 \, m5 Y. f+ d& a
: K- \+ Q7 a8 T# e4 L: D9 y. \( u3 A伟大的谢洛克·福尔摩斯说过:当其他可能都被排除之后,剩下的,即使再怎么不可思议,也一定是答案。
" z7 }9 z3 ~9 F. B, P* C; h9 j- x : E7 o: G7 E2 `! @
为了验证这个想法,我选择了一个曾经出现过上述现象的网站附近网段的某个IP。8 X* ]* x0 ]$ n; O: y& u1 @% \
直接访问这个IP的HTTP服务,正常情况下是没有页面的,应该返回 404错误。
3 x; G- n" e' ?4 S我写了一个脚本。不断访问这个IP,同时记录进出的数据包。
6 G& P/ Y6 _3 L在访问进行了120次的时候,结束请求,查看数据。120次请求中,118次返回的都是正常的404错误:6 Y; h9 ]7 ~9 o" h" ^
HTTP/1.1 404 Object Not Found% f9 @5 [4 o v: U ^/ N
Server: Microsoft-IIS/5.01 H0 B) a4 n0 E, H+ i; M2 U% q' z
Date: Mon, 19 Jul 2004 12:57:37 GMT
1 D4 g4 y4 I" s3 \& a! IConnection: close
! p" y- n3 u% C" R, MContent-Type: text/html f$ E4 [7 J0 E' ~5 B' O2 i, v
Content-Length: 111
6 J; R5 m- j# W5 J# F" T6 z7 A〈html〉〈head〉〈title〉Site Not Found〈/title〉〈/head〉
, V) c' g! t- q* r9 G〈body〉No web site is configured at this address.〈/body〉〈/html〉; U8 Z: b5 E0 s* e+ }
8 r3 q* G1 Q: Z3 c; e
但是有两次,返回了这个:
) T# S1 J6 f: D' kHTTP/1.1 200 OK
# ~4 ]6 n! m6 g( oContent-type: text/html
8 v0 G7 |$ ^7 D* ]〈html〉. A3 C. m) C* C3 l( _) u0 s( v+ h
〈meta http-equiv='Pragma' content='no-cache'〉
) B3 T g: \ z2 q9 @3 x: C〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉1 x8 k) P) q: |+ e+ Q4 M
〈script〉; P; u5 [- L, M6 ?8 X: N
window.open('http://211.147.5.121/DXT06-005.htm', '', 'width=400,height=330');3 x' J0 D* x$ L" P0 E% ^
〈/script〉+ L4 ~; ]" R) P9 b% B
〈head〉
: s2 H/ [: Y! ~0 J+ z) f〈title〉〈/title〉$ A$ V: B. k8 o. v" k9 H0 E& r( L! S
〈/head〉9 N% w- F. U" l
〈body〉9 [4 `( v3 f# Q. d& p
〈/body〉
: u9 C R/ N! d) v# R〈/html〉
% g% Q$ _- k; w8 B$ | % @! Q4 V4 I* o+ \ C1 H" z
更进一步分析数据包,可知劫持流程如下:& n6 o" c. G5 x5 B8 F
6 _- ]: o1 o" h- |2 f
A、在某个骨干路由器的边上,躺着一台旁路的设备,监听所有流过的HTTP会话。5 O6 K+ z/ l+ l3 @' E$ g4 [( L
这个设备按照某种规律,对于某些HTTP请求进行特殊处理。
6 d( \' b4 H# x, j) j( Y
7 ~2 X* c8 U7 Q) Q6 y* V! eB、当一个不幸的HTTP请求流过,这个设备根据该请求的seq和ack,把早已准备好的数据作为回应包,发送给客户端。
; Y$ T7 p9 b7 k这个过程是非常快的。我们的 HTTP请求发出之后,仅过了0.008秒,就收到了上面的回应。4 m3 v% p( p- M+ i# u" V/ l
而任何正常的服务器都不可能在这么短的时间内做出回应。
6 _1 P& n# t+ K$ ^ q3 z r : b1 ~7 z2 Q6 Z* {3 B
C、因为seq和ack已经被伪造的回应用掉了,所以,真正的服务器端数据过来的时候,会被当作错误的报文而不被接受。6 C x; u: F0 [: t- ^
2 M2 S) j8 G4 S, GD、浏览器会根据〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉这一行,+ j' e% r/ A5 C8 o' v1 V7 `
重新对你要访问的URL进行请求,这一次,得到了请求的真正页面,并且调用window.open函数打开广告窗口。, z k; R( L6 p# _, Q2 I! l
2 y% R6 n _( t$ z: V9 B# Z+ O在google中以“php?curtime”、“htm?curtime”、“asp?curtime”为关键字搜索,出现的基本上是国内网站,# y& p8 z$ U. b$ b, I
这表明,问题出在国内。用于inject的设备插在国内的某个或某几个大节点上。7 M X/ T) z+ l8 r
/ E0 Z5 e8 L$ k( N0 }
真相大白。我们被愚弄了,全中国的网民都成了某些人的赚钱工具。
) u* C8 @1 `) ? X) n& h- ^
6 Z1 Z2 H8 e. B/ |) S3、现在怎么办?1 J8 m% D- N" [" U8 k% z+ `6 N# I
: Q) Y2 l: {3 ^) J- m' j在坏家伙被捉出来之前,我们要想不受这个玩意的骚扰,可以考虑下面的方法:0 N B' s. A7 K5 G0 Z9 }0 D
4 G( _& B% g9 a
A、请各单位的网络管理员,在网络的边界设备上,完全封锁211.147.5.121。
; C5 x$ {, x9 S& F& a. O 0 l! c$ \. [- p
B、在你自己的个人防火墙上,完全封锁211.147.5.121。' S. b$ d$ ]0 `, m4 y
7 |' D( R( }$ O* o3 P# XC、如果你的浏览器是FireFox、Opera、GreenBrowser、或者MyIE,可以把“http://211.147.5.121/*”丢到弹出窗口过滤列表中去。4 b$ r+ v1 T7 _
( `4 p! p' M5 G6 w
绝不只是广告那么简单,这涉及到我们的选择,我们的自由,这比垃圾邮件更加肮脏和无耻。2 `' C" n/ @; t$ ~2 r' Z
今天是广告,明天就可能在你下载软件的时候给你加个adware或者加个病毒进去,谁知道呢?
" ]8 f# D; J$ N* P! B我们的HTTP通信完全控制在别人手里。1 L; R/ x: v' \& e: l- p7 Q: m
2 \9 T' r5 @) ^ T2 h) l
4、如何把坏家伙揪出来?
' p3 i# j+ x0 J. Q3 ]! ? % X) ^: D3 O* k# Q4 h5 g
如果你是一个有权力调查和处理这件事的人,从技术上,可以考虑下面的手段:2 \5 a7 o, \/ z+ w
4 o; d: M4 U' o8 O# z方法1:
7 r. p* x" f' ]) Z6 M
( c* |( {7 o' \: w' h伪造的回应数据中并没有处理TTL,也就是说,我们得到的回应数据中TTL是和inject设备位置相关的。, n) X* H# \( o
以我收到的数据包为例,真实的服务器端回应 TTL是107,伪造的回应TTL是53。4 {) v" E4 d% ?# W. [% v
那么,从我们这里到被请求的服务器之间经过了21(128-107)个节点,从我们这里到inject设备经过了11(64-53)个节点。' k: H2 J+ `: ]7 |+ y
只需要traceroute一下请求的服务器,得到路由回溯,往外数第11个节点就是安插inject设备的地方!
3 ]+ t9 z) }8 l) T: q5 Y
9 l# u- J" ?# F* n3 b) v方法2:6 t D' t5 @$ X( f' S: z* Z
3 C. }, o! _6 \3 Y8 s& ~
假如坏家伙也看到了这篇文章,修改了TTL,我们仍然有办法。( R. e( J8 f5 Q) j) l `8 d# _
在google上以下面这些关键字搜索:php?curtime,htm? curtime,asp?curtime,可以得到大量访问时会被inject的网址。
% W4 p1 @; F/ C ~- m; G8 S编写脚本反复访问这些网址,验证从你的ip访问过去是否会被 inject.将确实会被inject的结果搜集起来,
* S4 `* F3 v6 {5 [, `在不同的网络接入点上挨个用traceroute工具进行路由回溯。分析回溯的结果。
; D8 \4 v/ @1 i7 p' q- x$ s + I k& z( L( A% s$ Z
上面我们已经说明了,坏家伙是在某个或者某些重要节点上安插了inject设备,
+ ~2 V! }' C1 J4 u3 h% b0 _" C那么这个节点必然在被inject的那些网址到我们的IP之间的某个位置上。# R, t. l4 R; g6 J
例如有A、B、C、D四个被inject到的网站,从四个地方进行路由回溯的结果如下:
* v, L5 ^5 ^/ p/ U; ZMyIP-12-13-14-15-65-[89]-15-57-A
+ h( R+ U- A& M2 WMyIP-66-67-68-69-85-[89]-45-68-84-52-44-B4 ?% L/ y9 E2 ]
MyIP-34-34-36-28-83-[89]-45-63-58-64-48-41-87-C
8 o+ @- ~5 k0 GMyIP-22-25-29-32-65-45-[89]-58-D2 k( p# q! S% W) m% W7 l
% y, ]- O9 Z o% U9 \2 ?: ]4 f
显然,inject设备极大可能就在“89”所在的机房。
$ g4 V" A7 T) }: R( G+ y# \
- N: e% i4 J6 R! H1 @' \' t/ ^方法3:
/ ^8 |8 r A6 P1 K( E. f! R' k, G- I/ ~
' ~% b! ^6 C- W9 u2 p5 K& E另一方面,可以从存放广告业面的211.147.5.121这个IP入手,whois查询结果如下:
, A( Y$ W) T, [5 yinetnum: 211.147.0.0 - 211.147.7.255
6 S& I W4 Q( j7 I. |4 c) K! a8 hnetname: DYNEGY-COMMUNICATION
' F9 F' E+ c6 `3 Z6 W1 qdescr: DYNEGY-COMMUNICATION; m- i( h: j% F; v, B5 t
descr: CO.LTD
9 `1 {( O0 G s! _9 L7 |5 |descr: BEIJING
# U5 P( e1 ? Z! q' \/ p" j& Q) Pcountry: CN
, {% K% C7 s O- }0 T( r' Iadmin-c: PP40-AP
2 b4 g2 g k: h8 s4 B: `tech-c: SD76-AP+ C& _% C1 \- v9 u3 s; z
mnt-by: MAINT-CNNIC-AP$ R1 g- p+ L1 U9 E: ?( }! y
changed: [email protected] 200111126 f: [7 F0 e" Z7 C b0 |5 e3 d
status: ALLOCATED PORTABLE
5 Z* x" q* J7 S9 M2 x3 v! z4 xsource: APNIC' d0 A/ x4 b }2 K
person: Pang Patrick0 E( { M$ y/ J9 ?" y- @
nic-hdl: PP40-AP
; B1 T& x+ l* C2 j2 R6 w* Z" le-mail: [email protected]
( R1 M9 E' C, w s) C( W& ^address: Fl./8, South Building, Bridge Mansion, No. 53+ f! J: w1 z+ ?
phone: +86-10-63181513
2 X! [* F h9 B, `5 V, _fax-no: +86-10-63181597( V! N/ L* T0 @) z- U/ N
country: CN
9 w/ c1 d4 Q( s6 r8 Wchanged: [email protected] 200303044 j# ]) S; f* g5 y8 \! y. V
mnt-by: MAINT-CNNIC-AP0 H- i( T% V- A# v
source: APNIC
/ b g2 m d8 pperson: ShouLan Du8 s7 {7 x/ o! }5 W+ R V: Q4 W
address: Fl./8, South Building, Bridge Mansion, No. 53# V& z" f& ~7 P
country: CN
1 Y: f9 g2 w! q8 `2 `7 \phone: +86-010-83160000- _4 y& E+ C; H, ]4 \3 m3 |
fax-no: +86-010-831555284 v8 s8 O# D4 ?3 ]
e-mail: [email protected]* H6 R1 `' \# \* b
nic-hdl: SD76-AP" k; }: A6 y) W4 s
mnt-by: MAINT-CNNIC-AP
" y* t8 a) M% d7 P& o( tchanged: [email protected] 20020403
3 x6 Q& A4 R! {0 ksource: APNIC8 S- R* f) u, v& p( @: v4 D
7 ?2 |; r' a: S" F2 U6 \9 b6 I& Y
5、我为什么要写这篇文章?
) i7 Z2 F8 W, u, f+ g . B+ p1 T. M+ W D# _
新浪为我提供桃色新闻,我顺便看看新浪的广告,这是天经地义的;0 B5 M7 l" ]2 O- U, o0 A/ D) c
或者我安装某某网站的广告条,某某网站付给我钱,这也是天经地义的。
' f( T! y3 d, D" t可是这个 211.147.5.121既不给我提供桃色新闻,又不给钱,却强迫我看广告,这就严重伤害了我脆弱而幼小的心灵。
/ A2 j" c" J2 L事实上,你可以敲诈克林斯·潘,强奸克里奥·佩德拉,咬死王阳明,挖成吉思汗墓,我都不会计较,' m. M8 V6 s5 n3 H. H
但是现在你既然打搅了我的生活,我就不得不说几句了。
% l4 G: U7 R) a' D5 I2 N3 y 2 X6 N; t# V' X; t- [1 h
6、我是谁?
# g8 A! ]. I& h3 T: [" E0 r
3 T! O, x! v% P如果你知道MyName,又知道MyCount的话,那么,用下面这段perl可以得到:2f4f587a80c2dbbd870a46481b2b1882。# q( {0 P; r% t" @
#!/usr/bin/perl -w+ g G8 b" J0 H! O1 Z
use Digest::MD5 qw(md5 md5_hex md5_base64);$ \' [. ^% t" d
$name = 'MyName';8 R6 _$ O7 e' A6 F6 h
$count = MyCount;9 b1 e8 F- t6 ?7 d
for ($i=0; $i〈$count; $i++)7 Y, H6 |2 x6 j. V5 ]3 I L
{" U$ ]7 j# x5 @" F2 ^
$name = md5_hex($name);' H6 F# m, T9 o/ W
}
: L2 N V4 B [; \5 `6 Sprint $name;* p- a* r: S2 c
! R( g' v: j$ V以下签名,用于以后可能出现的关于此文的交流:. ?6 }" j6 g7 Z5 \: X; @
1 6631876c2aea042934a5c4aaeabb88e9
$ c+ U: d0 [8 L# X2 a6a607b3bcff63980164d793ff61d170
2 p8 D. V2 T7 {' E9 s4 x( ]8 F3 6a58e8148eb75ce9c592236ef66a34489 l% `2 i6 H2 H2 M# O
4 ded96d29f7b49d0dd3f9d171873563106 P! E8 f5 V/ C+ D- k# M
5 cc603145bb5901a0ec8ec815d83eea66 |