在剑盟看到的帖子,很值得玩味特此转来,建议新手就不用看了。0 M) b7 N P7 S
4 `/ b8 x6 {) G/ N* I' R; G
# s$ o, q, ]( K, j2 V" w+ g' `............................................................................................................................................# ` f) I3 X/ i6 o
5 ?6 l( c+ X+ I+ s8 L9 b3 |是谁控制了我们的浏览器?: H3 E2 ^* J, o' Z+ G$ ^& `! B$ V: o
1、现象是什么?
: F; ~) Z' b: N% k4 n2 z1 q 8 j; ?' `- a; o/ u; d: q
大约从今年年初开始,很多人就发现,在浏览一些网站的时候,
9 v/ S; ~* R" h6 g地址栏的url后面会被莫名其妙地加上“?curtime=xxxxxxxxxx”(x为数字),并且弹出广告窗口。" G2 s( z" J8 r# d. }; G5 b
很多人以为这是网站自己弹出的广告,也就没有在意。
, Y8 r5 @, o7 J% L+ ?
" r' k8 P# Z6 ^/ E我是属于很在意的那些人之一。
, G. n% N8 @* g0 u* s# ] * t4 c& Q$ v2 }3 X! [. i0 W
2、这是怎么回事?
* _2 g% d6 h B( S$ t! p
$ ]2 {: }7 {+ O经过测试和分析,我们发现,上述现象与使用何种浏览器无关(我们测试了各种流行的http客户端)," M6 J! H; _/ F Z5 X
与使用何种操作系统也无关(linux用户也有相关报告)。$ w9 {2 h9 E0 B; Q& D
我对出现该现象的IE浏览器进程进行了跟踪调试,没有发现任何异常。可以断定,并不是系统被安装了adware或者spyware。; d' P! H3 {+ E8 C9 Y& T8 l
7 l8 M: l8 A4 J' D u5 ~0 Y0 N( w
那么是不是那些网站自己做的呢?后来发现,访问我们自己管理的网站时也出现了这种情况,排除了这个可能。
( K0 b4 e& F6 D3 A+ I; W
2 v8 y3 `1 K/ F" ?( _* f+ l8 `那么剩下唯一的可能就是:有人在某个或某几个关键网络节点上安装了inject设备,9 ?* C+ o% v. d5 Q
劫持了我们的HTTP会话——我实在是不愿相信这个答案,这个无耻、龌龊的答案。+ b+ A: n5 [4 G5 }
, o1 E7 Z3 ~/ W) m7 O" `/ w
伟大的谢洛克·福尔摩斯说过:当其他可能都被排除之后,剩下的,即使再怎么不可思议,也一定是答案。
/ F: f7 h# A5 U( y6 o0 d1 G ) M1 y. J# w8 T7 y! V: A* b% n
为了验证这个想法,我选择了一个曾经出现过上述现象的网站附近网段的某个IP。' _, Y' ^2 R0 i
直接访问这个IP的HTTP服务,正常情况下是没有页面的,应该返回 404错误。8 J- b* u2 \: O
我写了一个脚本。不断访问这个IP,同时记录进出的数据包。
$ p0 @& @+ D$ |在访问进行了120次的时候,结束请求,查看数据。120次请求中,118次返回的都是正常的404错误:
( } a l$ J& d* d, SHTTP/1.1 404 Object Not Found3 l: t C" H& h# E
Server: Microsoft-IIS/5.0
: w- `7 Y/ g1 ?: m5 BDate: Mon, 19 Jul 2004 12:57:37 GMT
! v6 T% I& C2 dConnection: close
" `7 s+ W* ` bContent-Type: text/html5 J5 u" D1 @4 E# M
Content-Length: 111
4 P( R9 g0 }9 s4 N% V3 d$ e〈html〉〈head〉〈title〉Site Not Found〈/title〉〈/head〉2 x& { M- T' n1 u" o j( F+ A M; t1 p. N
〈body〉No web site is configured at this address.〈/body〉〈/html〉 f; H6 y- ^0 S& Z, w
# K+ y' ~( w4 n o+ G( n3 _* C但是有两次,返回了这个:
) k* l$ a) {$ a9 HHTTP/1.1 200 OK
9 o+ ]! T+ ~& SContent-type: text/html0 w( h# h. A0 f# b; L3 d
〈html〉
- Q5 s! M4 ~0 d! e〈meta http-equiv='Pragma' content='no-cache'〉7 J% J4 w( T5 z( a% _# W. h. W
〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉
; u- w+ ] ?7 g9 s〈script〉
4 A6 G. m: l% Y- ?' V0 b3 Q1 uwindow.open('http://211.147.5.121/DXT06-005.htm', '', 'width=400,height=330');( }$ F& G! }2 V* i+ ]) H$ X
〈/script〉
5 W) t3 l+ V$ U/ N; `〈head〉
1 t6 w. `& i" W5 E* O〈title〉〈/title〉
. t0 \0 _& |8 ^9 \〈/head〉2 _5 b) Q( b1 b5 n$ K4 [5 e
〈body〉9 w5 b' A. [! _/ l
〈/body〉 U) A2 s% d# @* `! K
〈/html〉% `' C' a8 \7 c3 d
2 [# C" P+ K3 z/ }7 s更进一步分析数据包,可知劫持流程如下:
% T# A4 x g: G
( U! _2 O& w5 w. ]- JA、在某个骨干路由器的边上,躺着一台旁路的设备,监听所有流过的HTTP会话。2 l$ B- y- p' u" ?8 X" q9 G
这个设备按照某种规律,对于某些HTTP请求进行特殊处理。: x) z! b8 z+ U4 u, ^; B- t
+ t2 n3 M9 \! ^8 d. f1 F5 I% f
B、当一个不幸的HTTP请求流过,这个设备根据该请求的seq和ack,把早已准备好的数据作为回应包,发送给客户端。" s% K4 B# }$ k. b
这个过程是非常快的。我们的 HTTP请求发出之后,仅过了0.008秒,就收到了上面的回应。
# ~/ X0 g; e# }' ^" v) [ ?而任何正常的服务器都不可能在这么短的时间内做出回应。* ?' D3 d% T# f4 d' k7 O" j
6 K+ W' z1 Z4 {; t: J' R
C、因为seq和ack已经被伪造的回应用掉了,所以,真正的服务器端数据过来的时候,会被当作错误的报文而不被接受。6 y0 F/ w& w5 P5 e6 F$ X
( n: r; x2 z5 f; m7 s. gD、浏览器会根据〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉这一行,
5 J* r! R% V9 T' x; t1 g0 B( E, _/ y重新对你要访问的URL进行请求,这一次,得到了请求的真正页面,并且调用window.open函数打开广告窗口。. g# H5 F6 H/ }
1 ]. e9 f5 \ N1 n0 W5 y# e0 r在google中以“php?curtime”、“htm?curtime”、“asp?curtime”为关键字搜索,出现的基本上是国内网站,/ s( \+ {8 @7 Y5 y
这表明,问题出在国内。用于inject的设备插在国内的某个或某几个大节点上。
: [: K1 d% l1 T+ k' \' y $ m. W4 G# y* Z, {) b
真相大白。我们被愚弄了,全中国的网民都成了某些人的赚钱工具。
+ k2 P$ q+ L8 v" W3 c; C
. W( ?, ?4 a) G# W: s3、现在怎么办?! x$ K1 v2 v) b9 C, w4 h% p- }
$ L" h5 J+ e2 r1 b4 m" B
在坏家伙被捉出来之前,我们要想不受这个玩意的骚扰,可以考虑下面的方法:
) X9 c: ]: j% l! X( j
4 ^2 S( T6 q, t" xA、请各单位的网络管理员,在网络的边界设备上,完全封锁211.147.5.121。& G$ m+ O4 U' B7 Y
0 j( s3 H4 H; ]B、在你自己的个人防火墙上,完全封锁211.147.5.121。" H- O2 m( g h
& w# B6 ^: }# a) p/ K% l) U. h+ ]' u
C、如果你的浏览器是FireFox、Opera、GreenBrowser、或者MyIE,可以把“http://211.147.5.121/*”丢到弹出窗口过滤列表中去。/ x6 p q8 y- O: l& j) P0 D4 h
% M* @4 b& W, E绝不只是广告那么简单,这涉及到我们的选择,我们的自由,这比垃圾邮件更加肮脏和无耻。6 }9 K- C. E# u6 _3 U3 C
今天是广告,明天就可能在你下载软件的时候给你加个adware或者加个病毒进去,谁知道呢?
! K/ L7 C1 z9 R, s我们的HTTP通信完全控制在别人手里。3 Z# X8 ^1 ]! W1 `5 {/ V* J
9 a+ p; ?! h3 r8 ]
4、如何把坏家伙揪出来?
8 ^4 M0 c% F- ]6 E, C# t# D! I % T9 f, F- r; I6 {8 L+ k
如果你是一个有权力调查和处理这件事的人,从技术上,可以考虑下面的手段:& Q3 z9 E' L* O. |* c
' x, _3 j9 n ~1 L方法1:) G" I$ z4 ^) k P7 E- C
, g8 w3 P @" R) Q: c伪造的回应数据中并没有处理TTL,也就是说,我们得到的回应数据中TTL是和inject设备位置相关的。6 y6 T, `0 A+ E' K1 @
以我收到的数据包为例,真实的服务器端回应 TTL是107,伪造的回应TTL是53。
' K& Q* ]% s( B5 e; G. E* y那么,从我们这里到被请求的服务器之间经过了21(128-107)个节点,从我们这里到inject设备经过了11(64-53)个节点。' E7 b s6 V, S/ d$ E3 {3 Y
只需要traceroute一下请求的服务器,得到路由回溯,往外数第11个节点就是安插inject设备的地方!" D* f! Y( s4 N
; p7 e4 G. Z+ ^ D5 a
方法2:4 d1 W% }" e: V& h7 m
! H( V% P. T8 j5 E假如坏家伙也看到了这篇文章,修改了TTL,我们仍然有办法。# [5 U7 k7 j6 Z* w! {& _
在google上以下面这些关键字搜索:php?curtime,htm? curtime,asp?curtime,可以得到大量访问时会被inject的网址。
8 ?3 r x) p" A; N; E, k3 F7 f$ X编写脚本反复访问这些网址,验证从你的ip访问过去是否会被 inject.将确实会被inject的结果搜集起来,4 `" F' y6 |+ z9 _% R+ g
在不同的网络接入点上挨个用traceroute工具进行路由回溯。分析回溯的结果。+ [* B# N6 @) O3 H/ O$ b
4 n% S( S) U1 x- Q0 {; f
上面我们已经说明了,坏家伙是在某个或者某些重要节点上安插了inject设备,- ?1 o' i8 ?8 x7 d! u
那么这个节点必然在被inject的那些网址到我们的IP之间的某个位置上。
$ C8 r$ N1 T. v, x( g1 k. q例如有A、B、C、D四个被inject到的网站,从四个地方进行路由回溯的结果如下:
% d2 q# g6 k6 a$ E1 MMyIP-12-13-14-15-65-[89]-15-57-A
0 ^/ _! v r4 r: @9 V* f, ]3 sMyIP-66-67-68-69-85-[89]-45-68-84-52-44-B
% a( E, h% i9 W) f' gMyIP-34-34-36-28-83-[89]-45-63-58-64-48-41-87-C2 ] G1 `( O# A% d
MyIP-22-25-29-32-65-45-[89]-58-D/ l( x" X3 g) ]! O. j
, p6 n: A1 L4 a* B& g9 P显然,inject设备极大可能就在“89”所在的机房。$ Q* E* m2 |$ R
& K" e, J& A4 X, |方法3:
! u, O* P' c/ @3 O
7 b5 _6 r+ t3 o5 Z$ V另一方面,可以从存放广告业面的211.147.5.121这个IP入手,whois查询结果如下:! w* r1 R5 T7 {* h& X
inetnum: 211.147.0.0 - 211.147.7.255& e4 R8 A; \! ^, V
netname: DYNEGY-COMMUNICATION" Q: F, d5 g2 v; X& R7 E8 V
descr: DYNEGY-COMMUNICATION
8 Y7 o2 M& x/ ?9 X% L! G, Ndescr: CO.LTD
! ?3 i: O" p3 r6 Mdescr: BEIJING2 [: P5 n+ O4 \3 Q9 e$ o
country: CN6 v9 {' E% ?* K. I* J! ]
admin-c: PP40-AP
+ n; R. _' v0 s p9 `" U+ G7 [/ btech-c: SD76-AP1 S" z' S* Q+ z: o* F. b
mnt-by: MAINT-CNNIC-AP, w$ t# B; r! D0 m+ O
changed: [email protected] 20011112
9 @: U- k2 K8 q$ s3 a e- ystatus: ALLOCATED PORTABLE
# m6 \( W- S2 n# i( ^source: APNIC7 _! a) |3 D8 V8 }6 f
person: Pang Patrick2 Q5 ?% M/ H. Z, @! R5 ^8 X
nic-hdl: PP40-AP
U) g, s/ b' b; d! L, {/ P/ pe-mail: [email protected]
& Q9 F( r# i+ C% q: J9 t3 Iaddress: Fl./8, South Building, Bridge Mansion, No. 538 H+ x! M$ R- t* b
phone: +86-10-63181513
. Q. L2 n5 V# ?$ wfax-no: +86-10-63181597
+ m' O4 o) {2 v7 @country: CN
- [9 U& o8 A5 u# S4 q- xchanged: [email protected] 20030304" g. g1 f0 J4 F! f
mnt-by: MAINT-CNNIC-AP
$ ^5 S- D: X1 ]; V, J* L7 Asource: APNIC1 y2 R1 V5 ~4 G7 Q9 V2 F! P
person: ShouLan Du
0 P% r3 G; z6 Z: K+ `' s0 h- `address: Fl./8, South Building, Bridge Mansion, No. 53/ c" e* k% {& z$ d' k
country: CN
' @6 f( y# Z9 O- x( v& y* [$ Sphone: +86-010-831600004 e; v+ W" A0 y `" n+ V3 t* z N
fax-no: +86-010-83155528) `1 O( m; n/ ~& e; n% }
e-mail: [email protected]4 i+ S9 `" T+ n4 `) K
nic-hdl: SD76-AP
: U! f5 j" m6 q2 Y: J0 ]" L3 Mmnt-by: MAINT-CNNIC-AP4 y8 R8 a( I) P3 M* I h4 l
changed: [email protected] 20020403
}8 N9 g0 {; Q! D2 ssource: APNIC
& r! s8 [4 S2 \( O$ Y 0 V9 a: p* n" y: N
5、我为什么要写这篇文章?7 a2 w5 ?. O! B" |5 G# N
* V0 p0 G- o& P, o) S/ a6 J新浪为我提供桃色新闻,我顺便看看新浪的广告,这是天经地义的;
, R/ L9 b. t( Y, g l) H: P# S1 g或者我安装某某网站的广告条,某某网站付给我钱,这也是天经地义的。5 K0 _4 L. h* g+ e
可是这个 211.147.5.121既不给我提供桃色新闻,又不给钱,却强迫我看广告,这就严重伤害了我脆弱而幼小的心灵。2 u/ u8 P n6 \
事实上,你可以敲诈克林斯·潘,强奸克里奥·佩德拉,咬死王阳明,挖成吉思汗墓,我都不会计较,
9 r; V7 S! D* F' D7 Z. Z但是现在你既然打搅了我的生活,我就不得不说几句了。8 K" D- x8 `4 Z1 |6 G& {8 z8 R
9 i& X' n, f z( Y6、我是谁?; ~3 s& _2 L }) T/ y6 P
8 y5 N2 l. ^- z7 R3 c9 W
如果你知道MyName,又知道MyCount的话,那么,用下面这段perl可以得到:2f4f587a80c2dbbd870a46481b2b1882。. k I6 T) B' y0 f0 h. A- t( W; r
#!/usr/bin/perl -w
" c' Z) R- B0 L- t0 `use Digest::MD5 qw(md5 md5_hex md5_base64);
- ^+ n0 b1 w* { P$name = 'MyName';
( }7 P3 N" X: y$ |+ S$count = MyCount;
2 e1 ~5 h9 o. |1 t7 d2 u' S$ Afor ($i=0; $i〈$count; $i++)' Y* J3 X9 u1 o) `
{! Z% k/ Q/ y% F4 i8 ` X4 Y
$name = md5_hex($name);
) q2 v0 v: [1 b5 d% O0 P! E}6 v3 F# p" d; Y9 f. Y% B7 F
print $name;! R/ D( a7 F# Q+ l1 i8 O. k$ V9 [; M2 `
) `4 N4 {5 k$ c6 I; m4 T5 {以下签名,用于以后可能出现的关于此文的交流:# F" a# [: h- `1 M# q9 E7 X
1 6631876c2aea042934a5c4aaeabb88e9" q0 f T* \- M
2 a6a607b3bcff63980164d793ff61d1700 O, z% I4 s. Z+ _! u
3 6a58e8148eb75ce9c592236ef66a3448
* P" ]3 I! n) I# [0 y4 ded96d29f7b49d0dd3f9d17187356310: a' h5 |& {9 D' [2 o/ r
5 cc603145bb5901a0ec8ec815d83eea66 |