|
在剑盟看到的帖子,很值得玩味特此转来,建议新手就不用看了。
7 { a" ~+ t1 b; U/ ~8 |3 \* K- x0 b! a# U- s% K' F
' ~1 _. }, E% C............................................................................................................................................2 c( @ ]( f$ Z/ Y
u* c/ f0 k6 C; ]. w! M" c" m0 X; O
是谁控制了我们的浏览器?( i5 f. g+ @; D" T
1、现象是什么?" s Q6 m/ V3 F/ s
B$ p7 K/ }" m( E
大约从今年年初开始,很多人就发现,在浏览一些网站的时候,' z7 v! M; b- @1 g: O5 P% u* l
地址栏的url后面会被莫名其妙地加上“?curtime=xxxxxxxxxx”(x为数字),并且弹出广告窗口。# j! h- Y+ y3 v# X3 t9 O
很多人以为这是网站自己弹出的广告,也就没有在意。 r5 m; }7 p7 w6 L
, y# G( e3 C2 z) O4 b, J我是属于很在意的那些人之一。; D, U3 w& i7 k; D! r
i3 R" s8 V! D y/ q, N2、这是怎么回事?
2 ^% M9 ?; _, }! k0 ?# z 2 |) p5 R0 _, `" Y; Y
经过测试和分析,我们发现,上述现象与使用何种浏览器无关(我们测试了各种流行的http客户端),! E" L! r2 q, ^' c# p3 D
与使用何种操作系统也无关(linux用户也有相关报告)。
! K2 [+ s4 b3 R5 |! L6 O) I' {6 p" c我对出现该现象的IE浏览器进程进行了跟踪调试,没有发现任何异常。可以断定,并不是系统被安装了adware或者spyware。
- U4 G, ?! u9 R5 h2 `& }
- ^2 v1 p( q, O, r" Y+ B7 h% w那么是不是那些网站自己做的呢?后来发现,访问我们自己管理的网站时也出现了这种情况,排除了这个可能。
3 J8 |# T- d8 W, k) J3 w
) \5 J1 p0 d B, r/ S那么剩下唯一的可能就是:有人在某个或某几个关键网络节点上安装了inject设备,4 W: N' j2 D- Q6 H, f
劫持了我们的HTTP会话——我实在是不愿相信这个答案,这个无耻、龌龊的答案。- P* b- o9 g: c3 z: C
$ m0 ^' f9 E5 S9 u, Y
伟大的谢洛克·福尔摩斯说过:当其他可能都被排除之后,剩下的,即使再怎么不可思议,也一定是答案。6 H: \% F) z; a1 I0 Y
0 _+ p1 c, P' @- U6 G; S为了验证这个想法,我选择了一个曾经出现过上述现象的网站附近网段的某个IP。 v0 }" g; w- a# S; `* N
直接访问这个IP的HTTP服务,正常情况下是没有页面的,应该返回 404错误。
( T% C- B' g: D' B0 R, M我写了一个脚本。不断访问这个IP,同时记录进出的数据包。4 [# j4 o% @* ~: X
在访问进行了120次的时候,结束请求,查看数据。120次请求中,118次返回的都是正常的404错误:
3 H5 m# m9 c9 rHTTP/1.1 404 Object Not Found
3 P |3 ]7 e/ ?! uServer: Microsoft-IIS/5.02 ]/ s& O0 z: Q4 R) L3 y! m
Date: Mon, 19 Jul 2004 12:57:37 GMT
! n: o0 K7 [+ \ Y6 j& bConnection: close
& p& h0 a8 R) J$ [8 |0 i+ R/ V8 x" \; qContent-Type: text/html
2 M# P4 j e- L" yContent-Length: 1117 h+ O8 v# x" p4 q, k
〈html〉〈head〉〈title〉Site Not Found〈/title〉〈/head〉
9 x ~) q; ~; s. \! G( K〈body〉No web site is configured at this address.〈/body〉〈/html〉2 W/ A* L7 ~. R' v5 t- U
; O2 h1 N% z6 K# Y% q& g
但是有两次,返回了这个:
1 L e$ V+ X- h, ~HTTP/1.1 200 OK
( b$ r ?4 h1 ?) Q$ t) fContent-type: text/html1 n& S7 N6 J8 {) ^! g X6 ], v( ]( L
〈html〉
5 P# t. ] N Y0 `0 y8 ?' z v〈meta http-equiv='Pragma' content='no-cache'〉
1 b- q( v2 I O: @2 C8 b* D〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉3 {1 N; h* r6 R5 V( S
〈script〉' b& `% {" T. y7 J, o
window.open('http://211.147.5.121/DXT06-005.htm', '', 'width=400,height=330');
, Z n) }. X7 c8 K' @, @4 K〈/script〉
8 `( i% W% }& y+ A( D$ ^〈head〉3 P/ Q4 R3 r& z8 C
〈title〉〈/title〉
' @- }, P! E! R6 i〈/head〉
$ u/ u2 L2 L) a* d% M0 {+ _6 N〈body〉
% u* P# q) S3 W- u: ~/ u〈/body〉6 n4 |' m, P Y8 [
〈/html〉
6 ^5 g, X- s4 K$ K, \ 0 }- o# P9 ?& e4 S r# t& f* S+ g, _
更进一步分析数据包,可知劫持流程如下:; }: k" k( V+ H# \
$ Z- w2 F3 d$ d4 O
A、在某个骨干路由器的边上,躺着一台旁路的设备,监听所有流过的HTTP会话。
& Z6 E4 \% q7 Z这个设备按照某种规律,对于某些HTTP请求进行特殊处理。
. ^* C; p6 M4 i, Z5 ?! d9 ` & ]5 }8 L- P/ v) a# ^0 k
B、当一个不幸的HTTP请求流过,这个设备根据该请求的seq和ack,把早已准备好的数据作为回应包,发送给客户端。
2 t+ U$ i8 C' U( T3 Z2 ?这个过程是非常快的。我们的 HTTP请求发出之后,仅过了0.008秒,就收到了上面的回应。: t) Q1 i5 Y$ i
而任何正常的服务器都不可能在这么短的时间内做出回应。* C: ?! R2 A7 D% k: T" d5 t
6 r$ E0 k( o/ H9 q. N: LC、因为seq和ack已经被伪造的回应用掉了,所以,真正的服务器端数据过来的时候,会被当作错误的报文而不被接受。
( l" m* Y% ]0 e! }4 S* } 8 t+ n- r& u8 r+ H7 Z
D、浏览器会根据〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉这一行,
! F3 c- I! d' p! ~重新对你要访问的URL进行请求,这一次,得到了请求的真正页面,并且调用window.open函数打开广告窗口。
, @# m% f& b8 y7 P+ `) U4 ?( T- y ; Z! S q( [' N# }7 n- g/ |; j, _
在google中以“php?curtime”、“htm?curtime”、“asp?curtime”为关键字搜索,出现的基本上是国内网站,0 U7 Z; y. n- B2 B
这表明,问题出在国内。用于inject的设备插在国内的某个或某几个大节点上。5 Z# f4 @+ ~& D4 k Z$ o. Z
; G [9 J" I. A& W3 |5 q( l真相大白。我们被愚弄了,全中国的网民都成了某些人的赚钱工具。; K8 o8 B1 g+ @2 X/ }3 A
) K, k% f: B" z0 w
3、现在怎么办?
: c# r2 `) B% g" J, ?6 @* V " I3 g2 @* ]( L3 \
在坏家伙被捉出来之前,我们要想不受这个玩意的骚扰,可以考虑下面的方法:
+ N9 O1 h% E; Y9 V% i 6 ~8 w0 Z. b3 [$ @' o& P
A、请各单位的网络管理员,在网络的边界设备上,完全封锁211.147.5.121。, v8 j0 T- {5 W% z8 t9 m# K
. T; K) J1 t" d" _4 X! C% s
B、在你自己的个人防火墙上,完全封锁211.147.5.121。
9 l& E i2 k% G- t9 b 8 q6 W/ i0 a9 V7 R& q [7 |! ?
C、如果你的浏览器是FireFox、Opera、GreenBrowser、或者MyIE,可以把“http://211.147.5.121/*”丢到弹出窗口过滤列表中去。- D0 P, G8 C. f( P p
. U- O5 i6 r4 j; [. t' ?
绝不只是广告那么简单,这涉及到我们的选择,我们的自由,这比垃圾邮件更加肮脏和无耻。7 C0 ~3 C7 ~ `5 w
今天是广告,明天就可能在你下载软件的时候给你加个adware或者加个病毒进去,谁知道呢?
2 ]% l4 e. h+ Y/ |( q: c我们的HTTP通信完全控制在别人手里。
. \* z0 P0 `: d6 u/ Z I% n ' g" v$ N" H8 `( Y5 O! F w8 \
4、如何把坏家伙揪出来?) z c( M- I: H. i a4 A
7 ]- U* O! ?( N
如果你是一个有权力调查和处理这件事的人,从技术上,可以考虑下面的手段:; R4 ^. N) b/ s0 `9 T8 h
& D3 {6 a& U, m) G* m5 K. Q* a( u方法1:
, u& N, K2 @7 J! C# J3 L/ s 5 Q+ E# O1 D( F" B2 s, P
伪造的回应数据中并没有处理TTL,也就是说,我们得到的回应数据中TTL是和inject设备位置相关的。
* w+ Y! X K9 Q% p) h. A8 L以我收到的数据包为例,真实的服务器端回应 TTL是107,伪造的回应TTL是53。
3 y: F+ ?8 I& e) e9 E那么,从我们这里到被请求的服务器之间经过了21(128-107)个节点,从我们这里到inject设备经过了11(64-53)个节点。
1 T. H" ~1 |7 ]2 `只需要traceroute一下请求的服务器,得到路由回溯,往外数第11个节点就是安插inject设备的地方!
% v* u/ F: D1 J- L 1 L9 }& c- ?& \0 B/ H4 s( {6 N6 s- B
方法2:
8 Y' S( M. t* @
, h0 r% z' R: Y1 t8 ~+ l: g# O假如坏家伙也看到了这篇文章,修改了TTL,我们仍然有办法。
8 A7 V+ t' W4 G1 l* M+ Z( w& `4 Z2 j在google上以下面这些关键字搜索:php?curtime,htm? curtime,asp?curtime,可以得到大量访问时会被inject的网址。
: k& D% O) k+ Q+ O; t编写脚本反复访问这些网址,验证从你的ip访问过去是否会被 inject.将确实会被inject的结果搜集起来,
2 C5 |0 N, @! |2 ]- z在不同的网络接入点上挨个用traceroute工具进行路由回溯。分析回溯的结果。* ]3 o. W8 x& `# R! _- b
" v* s2 h. m& _7 f3 F
上面我们已经说明了,坏家伙是在某个或者某些重要节点上安插了inject设备,( _6 V; u; e% L7 c' }: i. b
那么这个节点必然在被inject的那些网址到我们的IP之间的某个位置上。* s& Y) b. {, a. j: W) ^' P
例如有A、B、C、D四个被inject到的网站,从四个地方进行路由回溯的结果如下:3 ]7 X/ i9 t; ~0 N [! \ k; Q8 d
MyIP-12-13-14-15-65-[89]-15-57-A
4 I0 u7 T3 B3 T- `" d( BMyIP-66-67-68-69-85-[89]-45-68-84-52-44-B$ k$ Q+ p/ l+ }* G9 p7 Q' u: Y! t
MyIP-34-34-36-28-83-[89]-45-63-58-64-48-41-87-C0 e h$ g0 w7 Y( z8 v+ n- L
MyIP-22-25-29-32-65-45-[89]-58-D
0 }5 o0 ]; T. p/ m( _0 r/ P
3 Q. v! \0 [, F+ K: M显然,inject设备极大可能就在“89”所在的机房。% g) w( q) |1 M2 t. I# g4 O$ j
S: V0 l- g n; R# J: U0 N方法3:* ]3 x1 o5 m1 L6 r* s2 y/ v
7 h+ P! v8 d: o. b% T
另一方面,可以从存放广告业面的211.147.5.121这个IP入手,whois查询结果如下:: W3 P; T* S# \; S: b+ q
inetnum: 211.147.0.0 - 211.147.7.255: A$ O" z9 _/ Z5 B& N
netname: DYNEGY-COMMUNICATION
) b9 e3 v) A5 odescr: DYNEGY-COMMUNICATION
$ s( ~ Y$ z- d5 K2 e! D# Ydescr: CO.LTD- x) M" E) M* q. Y
descr: BEIJING: t# W2 D1 d0 a( o
country: CN# o" k( m* H8 T. M$ J7 W `
admin-c: PP40-AP
& { G4 A" v# z! u9 `4 s1 k8 l9 Btech-c: SD76-AP
. P) J' J& w7 I5 i! `0 kmnt-by: MAINT-CNNIC-AP
4 K1 B0 v4 }; F0 G* @- p$ Bchanged: [email protected] 200111123 }7 R1 Y7 X7 q
status: ALLOCATED PORTABLE
* B- I# n ?9 f1 i: c- _ P. ysource: APNIC( L- p: ?: R4 P" g4 }0 S, a' H; k
person: Pang Patrick
5 t7 I% ?: G) o5 Z7 {% Pnic-hdl: PP40-AP
$ L) G; q, _1 z5 ?e-mail: [email protected]
2 S+ k/ F, {* K( Y* {6 ]+ ^; yaddress: Fl./8, South Building, Bridge Mansion, No. 53
& L2 P! i5 @! M# {: q j7 tphone: +86-10-63181513
6 O# j4 w* A: B6 {; hfax-no: +86-10-63181597% A6 X( j s$ _+ `) j
country: CN
* f3 W3 x1 A* \2 T* Mchanged: [email protected] 20030304* m: J& m" I" U3 _( S( \
mnt-by: MAINT-CNNIC-AP
) I- t5 n7 n1 |) e0 H1 ~1 Tsource: APNIC
, g H) u. C Q; ?+ Q2 W) K# Fperson: ShouLan Du/ g' Q) N4 t4 t; E0 E
address: Fl./8, South Building, Bridge Mansion, No. 53' q6 S! P0 b( [+ z; o1 ^
country: CN
( e. ?) h& O8 A6 V" ^" cphone: +86-010-83160000
9 B6 K s8 }, r5 _- |+ Ffax-no: +86-010-83155528
1 V# @$ b. j4 T3 }" \& A8 he-mail: [email protected]" Y3 [* o, C+ C- i8 c9 ~/ H
nic-hdl: SD76-AP1 D. h+ B7 J3 _( C/ P- f
mnt-by: MAINT-CNNIC-AP. O$ ]( t# Y$ F3 z
changed: [email protected] 20020403
: y. H. G6 x r" gsource: APNIC
( ^" T7 G% o" T# Q; N x. T, q ; y b7 M" f* c& b
5、我为什么要写这篇文章? e, _2 E, T# z
, Z& i6 k' j( {: N1 S2 L
新浪为我提供桃色新闻,我顺便看看新浪的广告,这是天经地义的;
# c. X5 ]/ o$ F$ h! M# \' t或者我安装某某网站的广告条,某某网站付给我钱,这也是天经地义的。& ~! [- a" z/ t% e3 B% c0 g& H
可是这个 211.147.5.121既不给我提供桃色新闻,又不给钱,却强迫我看广告,这就严重伤害了我脆弱而幼小的心灵。
# ?! b1 H# L) K8 i事实上,你可以敲诈克林斯·潘,强奸克里奥·佩德拉,咬死王阳明,挖成吉思汗墓,我都不会计较,
7 u2 t9 E1 N1 f8 u! W r. ?: @/ ]但是现在你既然打搅了我的生活,我就不得不说几句了。4 O$ ]3 d# M. [8 E3 X
& P+ z: b# c4 v
6、我是谁?7 T" m" h$ A+ ^4 I' B7 e
- B% Y3 t# E; M2 F6 c W
如果你知道MyName,又知道MyCount的话,那么,用下面这段perl可以得到:2f4f587a80c2dbbd870a46481b2b1882。 r* c4 G: l5 F/ |8 H0 m
#!/usr/bin/perl -w9 n; @4 C/ `0 R% s. ~
use Digest::MD5 qw(md5 md5_hex md5_base64);
6 b- T% p1 p j5 o2 d& x- |$name = 'MyName';
- D1 b' p" m7 M3 @* k$count = MyCount;2 v0 Q" Q, j J i8 @
for ($i=0; $i〈$count; $i++)
) U, h# Z2 B( d{5 m) d$ n$ d* z9 z/ C" [$ a" a
$name = md5_hex($name);: n; I' x, E& K
}# M" W* G. j0 p0 a. M
print $name;
, b0 A: k! D, [ . ^2 _+ u$ A% m. P
以下签名,用于以后可能出现的关于此文的交流:
+ ~' F7 G* Z- k& r9 `1 6631876c2aea042934a5c4aaeabb88e9
. {3 a! b8 ~7 Z8 t( |. Y2 a6a607b3bcff63980164d793ff61d170! q( W* f3 W* x s, k0 l% J
3 6a58e8148eb75ce9c592236ef66a3448- N& z+ v$ m3 H, Q" |
4 ded96d29f7b49d0dd3f9d171873563106 i# Z: ~' ]1 }0 x$ `
5 cc603145bb5901a0ec8ec815d83eea66 |