在剑盟看到的帖子,很值得玩味特此转来,建议新手就不用看了。* A& J6 ^. F5 h/ N: s; S
6 F+ M8 b( g3 R( A5 d. u( P+ a' c4 @1 t4 {5 F/ x5 U9 D
............................................................................................................................................
/ `4 `1 b/ y a3 g* q2 g9 M& v- e" B) Z* M; w: r
是谁控制了我们的浏览器?
/ K# @$ r+ s; w: Q, l$ q v! F z1、现象是什么?& R7 V" E# @8 p# _3 ~
& H* Q% x( Z+ `6 `) n
大约从今年年初开始,很多人就发现,在浏览一些网站的时候,
" Z( c4 r9 E P! d地址栏的url后面会被莫名其妙地加上“?curtime=xxxxxxxxxx”(x为数字),并且弹出广告窗口。
7 A$ y" U) r6 K* m F很多人以为这是网站自己弹出的广告,也就没有在意。
# f' k [0 s+ M7 N8 T( \# R3 g: d' z
: b. o# d V' }* M我是属于很在意的那些人之一。
1 z4 l) K" S; l) A; [* C" k5 d k, ?1 `; K2 z- f8 d/ H0 F& U2 L
2、这是怎么回事?
" Q; `2 n* c( F8 F
6 h' I0 P& B3 t8 I) f! Q经过测试和分析,我们发现,上述现象与使用何种浏览器无关(我们测试了各种流行的http客户端),% _9 J/ M& l- w3 _. y# h- U+ n
与使用何种操作系统也无关(linux用户也有相关报告)。0 S+ j& e5 G4 U4 o: A6 t
我对出现该现象的IE浏览器进程进行了跟踪调试,没有发现任何异常。可以断定,并不是系统被安装了adware或者spyware。. @) a9 P9 F' }, ^. l5 N) _
0 |+ y6 C8 t% s/ `
那么是不是那些网站自己做的呢?后来发现,访问我们自己管理的网站时也出现了这种情况,排除了这个可能。
2 w2 T1 {% Z( K8 O6 ]4 P2 k 3 J8 Z4 ~. D# H, S0 ~2 U& P( d
那么剩下唯一的可能就是:有人在某个或某几个关键网络节点上安装了inject设备,
" g# A: r2 H# @, k5 Z$ {7 k劫持了我们的HTTP会话——我实在是不愿相信这个答案,这个无耻、龌龊的答案。
. m& Q, r1 Y0 @- y# U& C# R' M ; [9 f& ?. P, I( m! X
伟大的谢洛克·福尔摩斯说过:当其他可能都被排除之后,剩下的,即使再怎么不可思议,也一定是答案。1 y( `. X& S- d, _+ ^& V
0 E L9 N; j/ H. v; n! M4 a# O9 c为了验证这个想法,我选择了一个曾经出现过上述现象的网站附近网段的某个IP。
8 f& [. W. q5 p/ J8 i) T; B0 t直接访问这个IP的HTTP服务,正常情况下是没有页面的,应该返回 404错误。2 v6 Z) |! x# u& T1 S
我写了一个脚本。不断访问这个IP,同时记录进出的数据包。
2 t, ]! c" q7 R7 C: o$ n# k, U% B在访问进行了120次的时候,结束请求,查看数据。120次请求中,118次返回的都是正常的404错误:
( y4 U) V6 U# y- sHTTP/1.1 404 Object Not Found
4 w d7 E3 V; C+ ^; P: S0 Z9 qServer: Microsoft-IIS/5.0) E- z0 T$ C7 C( ~2 p
Date: Mon, 19 Jul 2004 12:57:37 GMT( F# l; `! c% }0 G7 `: v! P
Connection: close6 g0 D+ q* F% g
Content-Type: text/html
) ?! }, L' P! [5 h, y. nContent-Length: 111
, S5 G$ r, j) r. ~5 @〈html〉〈head〉〈title〉Site Not Found〈/title〉〈/head〉$ r3 e/ a9 M! ]* h& Y a, F( W0 f
〈body〉No web site is configured at this address.〈/body〉〈/html〉
D g9 s' F- z. K& [. G 3 z( t5 A$ V- O. O% X9 p, y
但是有两次,返回了这个:( x7 u2 l% J: R2 a5 c! D8 _
HTTP/1.1 200 OK
# H$ \# q7 j( r* UContent-type: text/html
/ p; W5 b9 o5 K5 X〈html〉+ y3 ~& y0 o- n( B* Z
〈meta http-equiv='Pragma' content='no-cache'〉
! A) X) S: c4 j7 V〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉( }: F" `1 e& o( X% j# c" ?
〈script〉8 y1 s9 z# k* A/ s Z. b, u& e% E* U- j! r
window.open('http://211.147.5.121/DXT06-005.htm', '', 'width=400,height=330');+ f6 W# d+ r) U
〈/script〉" P. J! ]( `5 h6 v/ f8 ?
〈head〉
3 r& Q- Z" F- \8 L: h〈title〉〈/title〉5 t" B6 G* W+ @9 r# p
〈/head〉5 `1 [' U+ R6 R* M
〈body〉
, C! |: C7 Z( C' s# U' J) i+ A% `+ d〈/body〉
: |0 O" [ ?; _1 ?/ ?. C7 l P2 i( T〈/html〉
' j& ]5 s7 y" q8 Q3 M% q- C # x2 d. D g- h7 @
更进一步分析数据包,可知劫持流程如下:
+ h) T' ^% s: v) [
9 z1 r3 y9 i( i: x# ~/ nA、在某个骨干路由器的边上,躺着一台旁路的设备,监听所有流过的HTTP会话。$ e. H# D9 |- A9 |. ]3 S
这个设备按照某种规律,对于某些HTTP请求进行特殊处理。
" O# h$ E1 G7 O2 U- O' k3 h& q
8 ?7 q2 a$ Y/ z5 ~B、当一个不幸的HTTP请求流过,这个设备根据该请求的seq和ack,把早已准备好的数据作为回应包,发送给客户端。* d# ]6 a% _+ `
这个过程是非常快的。我们的 HTTP请求发出之后,仅过了0.008秒,就收到了上面的回应。: M0 V# q; E2 w
而任何正常的服务器都不可能在这么短的时间内做出回应。* \2 D# F0 b" c6 [! M, ^) ^
. l: h/ T9 Z5 k# U/ v' @
C、因为seq和ack已经被伪造的回应用掉了,所以,真正的服务器端数据过来的时候,会被当作错误的报文而不被接受。
& X3 K) X6 o6 D 2 I: J+ k$ ?" H2 \# m
D、浏览器会根据〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉这一行,0 s1 b3 a1 V) T- H
重新对你要访问的URL进行请求,这一次,得到了请求的真正页面,并且调用window.open函数打开广告窗口。+ O" u( N9 X( s
& K% B. B# P: F: i7 X
在google中以“php?curtime”、“htm?curtime”、“asp?curtime”为关键字搜索,出现的基本上是国内网站,+ r7 \% r' h* `
这表明,问题出在国内。用于inject的设备插在国内的某个或某几个大节点上。1 u. ~1 T- |: h5 X3 Q
1 P8 G' f) E4 ?1 A. G2 Z1 @1 c# i
真相大白。我们被愚弄了,全中国的网民都成了某些人的赚钱工具。4 F5 Y& B' S) ]1 ^
7 Q1 O( B* g0 t N5 |; `3、现在怎么办?
# \6 U" ?3 p, O 4 Z% {2 ]0 s8 L/ ^* c. f
在坏家伙被捉出来之前,我们要想不受这个玩意的骚扰,可以考虑下面的方法:! [& {8 @& c( ~" D
2 z8 }, ?- h w: X8 m+ [! t$ _A、请各单位的网络管理员,在网络的边界设备上,完全封锁211.147.5.121。
0 j$ X7 w; k# `
' B% i0 i+ f+ A' z% ^( h0 kB、在你自己的个人防火墙上,完全封锁211.147.5.121。9 e3 N* W3 Y- _) O/ u5 C. P
6 N: g8 A# [' a5 ^$ Q; Q
C、如果你的浏览器是FireFox、Opera、GreenBrowser、或者MyIE,可以把“http://211.147.5.121/*”丢到弹出窗口过滤列表中去。1 G0 w2 x. a( n5 q. C1 y, }1 b
) F3 P, k+ C" j# w$ | H: j9 Q5 _
绝不只是广告那么简单,这涉及到我们的选择,我们的自由,这比垃圾邮件更加肮脏和无耻。
2 j7 l f/ {, P今天是广告,明天就可能在你下载软件的时候给你加个adware或者加个病毒进去,谁知道呢?
& N+ K, w. [) A- k我们的HTTP通信完全控制在别人手里。0 L: U! {$ q( ?# V5 Y6 ]3 M
( K0 H( G; h/ Y7 v4、如何把坏家伙揪出来?
0 l; X9 I( x" {, Q8 ?; N ~0 t9 Q' ^ & x9 w( g4 g! O( \" S! R
如果你是一个有权力调查和处理这件事的人,从技术上,可以考虑下面的手段:
/ L' _2 A: \$ ^" ]3 Z- C( J ( o0 Y- M: ?* L
方法1:
5 L- E/ R% n' d, s. T% G8 j! Y0 _
1 a$ o* A6 ^- i& ?+ A伪造的回应数据中并没有处理TTL,也就是说,我们得到的回应数据中TTL是和inject设备位置相关的。1 E) z; N; m6 r0 x( `$ w% x, F9 l
以我收到的数据包为例,真实的服务器端回应 TTL是107,伪造的回应TTL是53。) T1 C; p, V& I( |: C4 l2 e5 u6 J
那么,从我们这里到被请求的服务器之间经过了21(128-107)个节点,从我们这里到inject设备经过了11(64-53)个节点。( h) o. d7 y* j8 K; M/ d `7 [9 \
只需要traceroute一下请求的服务器,得到路由回溯,往外数第11个节点就是安插inject设备的地方!
6 ]. g9 l3 x1 ^) [
1 p- N) ]# o* ^: y( f- F方法2:' L$ H6 P: q5 j, z9 r
9 s3 r7 M3 \3 w3 u8 A. V
假如坏家伙也看到了这篇文章,修改了TTL,我们仍然有办法。5 B% P% N1 r% J+ _3 `5 L7 x
在google上以下面这些关键字搜索:php?curtime,htm? curtime,asp?curtime,可以得到大量访问时会被inject的网址。7 `% s" {. m" A4 O
编写脚本反复访问这些网址,验证从你的ip访问过去是否会被 inject.将确实会被inject的结果搜集起来,
+ r8 z0 ~% S- M" p在不同的网络接入点上挨个用traceroute工具进行路由回溯。分析回溯的结果。
/ a1 L( @" D5 o, z $ m3 Z) s; J1 D
上面我们已经说明了,坏家伙是在某个或者某些重要节点上安插了inject设备,& v& s3 P! y$ ^* u0 o
那么这个节点必然在被inject的那些网址到我们的IP之间的某个位置上。$ J" | B" `9 L/ l1 r- X
例如有A、B、C、D四个被inject到的网站,从四个地方进行路由回溯的结果如下:
/ P) c7 j* O+ q/ {! F. D) pMyIP-12-13-14-15-65-[89]-15-57-A: X; [/ m! _: y/ B, A j W
MyIP-66-67-68-69-85-[89]-45-68-84-52-44-B+ O7 a8 H+ q& B# O3 l- f; ^
MyIP-34-34-36-28-83-[89]-45-63-58-64-48-41-87-C1 Y- m, }" T* J; J: F* k0 |
MyIP-22-25-29-32-65-45-[89]-58-D& X4 n2 z! @% d2 q3 s9 u, C& F
) P4 X0 D0 X2 m
显然,inject设备极大可能就在“89”所在的机房。
/ V/ S. Q% h9 S+ i6 Q
* g! m/ S) u9 u$ p方法3:
. l c9 x7 E) @% ^- m3 k: j
- G9 P: [0 @0 C1 e4 e0 F- S2 s另一方面,可以从存放广告业面的211.147.5.121这个IP入手,whois查询结果如下:; W- Q- l9 y9 g y
inetnum: 211.147.0.0 - 211.147.7.255: C' w; f/ p; Q4 D! |8 X
netname: DYNEGY-COMMUNICATION
2 x, T& J" _+ I5 ldescr: DYNEGY-COMMUNICATION
* ^+ X- _9 J* h! H4 I+ X2 ddescr: CO.LTD4 L" Z* w6 }+ j: l! _/ z
descr: BEIJING! J s0 f1 O% M8 \! S5 o
country: CN& Z8 c& N! N8 \6 X! ~* y
admin-c: PP40-AP4 X$ d0 H( J. q6 S2 a
tech-c: SD76-AP
/ Y5 X$ X( f, F7 m) Ymnt-by: MAINT-CNNIC-AP
5 T1 S u0 u, S9 }changed: [email protected] 20011112
6 ?' a% P# v$ ?* R. @status: ALLOCATED PORTABLE5 F" }- M' u& Z; y# J
source: APNIC
2 R6 o" [( c* G) S6 x$ d0 y7 Qperson: Pang Patrick9 T4 T9 a5 A' ^, B
nic-hdl: PP40-AP
: V& C6 p6 _! X0 O6 `e-mail: [email protected]! T8 D( T% c( ^' N: I
address: Fl./8, South Building, Bridge Mansion, No. 534 P8 ]8 a; q- o; L: Z+ m3 W4 M
phone: +86-10-631815137 r/ t9 W% ?8 e7 N: ^! Y+ s
fax-no: +86-10-631815974 G0 ~0 @. |' X R, x. k* E; E( e2 k
country: CN1 `! x. X) O' z, N
changed: [email protected] 20030304, L0 A. {: ~9 [/ E2 B
mnt-by: MAINT-CNNIC-AP& h# j1 ?5 z. x! T9 a* f$ j
source: APNIC+ R* v% a7 L0 y% A8 w, T& J2 l# ]
person: ShouLan Du
! E$ n' ?' x2 ~' W' u/ Z' naddress: Fl./8, South Building, Bridge Mansion, No. 53
7 e) x* _8 G5 \6 a l( R" q$ Pcountry: CN
% ^4 L5 p9 ?7 a# m% B3 ophone: +86-010-83160000
6 t. Y3 A1 @3 k" }2 I& ?* ifax-no: +86-010-83155528
) P1 z) V3 |' P% c! Xe-mail: [email protected]2 F+ M# s0 i7 k; T" I- Z: {
nic-hdl: SD76-AP0 A# u2 O8 E* p. g. Z, I
mnt-by: MAINT-CNNIC-AP
0 k! \, b0 F6 z6 J4 ^6 m3 M( j( [4 H) dchanged: [email protected] 20020403
% t+ D( W. V! e2 G0 fsource: APNIC
" x4 V; @% s6 P {: |1 e8 h/ R7 |
5、我为什么要写这篇文章?
8 T8 x9 E9 J) @) |1 i " Z/ ]" x$ f3 w+ f2 F, o Y
新浪为我提供桃色新闻,我顺便看看新浪的广告,这是天经地义的;( d7 W1 f, r j. Q* u( i
或者我安装某某网站的广告条,某某网站付给我钱,这也是天经地义的。
% o5 m2 c1 [. t7 y% w6 m' h5 ^" ~可是这个 211.147.5.121既不给我提供桃色新闻,又不给钱,却强迫我看广告,这就严重伤害了我脆弱而幼小的心灵。: ^" D4 F7 Y9 p* t
事实上,你可以敲诈克林斯·潘,强奸克里奥·佩德拉,咬死王阳明,挖成吉思汗墓,我都不会计较,7 H Z, j+ X( w) e3 r
但是现在你既然打搅了我的生活,我就不得不说几句了。
2 N3 T$ |- w5 q' K& q6 `! S8 j 3 t3 @- G' z: u5 N2 O" l2 b
6、我是谁?- ?; V7 l+ E7 |' W8 \
: Z" ^; Y/ D5 J* _; g1 g1 E( D5 c如果你知道MyName,又知道MyCount的话,那么,用下面这段perl可以得到:2f4f587a80c2dbbd870a46481b2b1882。
3 e# I4 i: P2 s) B2 B5 Y#!/usr/bin/perl -w7 S4 g; i- A, X7 a
use Digest::MD5 qw(md5 md5_hex md5_base64);4 C2 X5 U! k# |( }# g0 Y
$name = 'MyName';8 f& s5 m3 x* D8 V, b
$count = MyCount;
% F; O8 F: r" }2 Q, b. Cfor ($i=0; $i〈$count; $i++)8 L3 n5 @+ v* f. T( A" y
{
+ x! J3 @" R: n3 W! Q$name = md5_hex($name);: P2 v" M" w; e3 t
}; I: A: L: {$ f, b& {
print $name;3 S( E# t* o- O- y; h9 c
0 G( {! T; `! m
以下签名,用于以后可能出现的关于此文的交流:
% J" d0 ^9 O, F7 l/ Y# k& T! n6 k1 6631876c2aea042934a5c4aaeabb88e91 H- @1 `* c4 B0 C# @& }
2 a6a607b3bcff63980164d793ff61d170
9 f! Q' @, p% G' ?3 6a58e8148eb75ce9c592236ef66a3448
1 l1 Y0 f0 S% _# T2 x; Z% N4 ded96d29f7b49d0dd3f9d17187356310
% \$ p8 g, S2 u$ O# a' X) R* N V5 cc603145bb5901a0ec8ec815d83eea66 |