在剑盟看到的帖子,很值得玩味特此转来,建议新手就不用看了。& ~. F, w7 {" d2 S6 H
: K9 v; e I; y+ _* n* `4 M& ]( s' f8 o1 r$ w
............................................................................................................................................
f$ e8 a, g$ _" w& r( J1 v2 x0 d
是谁控制了我们的浏览器?) o6 B' l) f/ @/ x# G) h6 O8 w' Y! `7 o
1、现象是什么?
0 G" v" M, _$ v5 G# l7 J3 C- g6 z( S + {' B% |7 m: Y3 L! `( {# w. w, a5 V
大约从今年年初开始,很多人就发现,在浏览一些网站的时候,
8 u# s, p& W8 v2 g地址栏的url后面会被莫名其妙地加上“?curtime=xxxxxxxxxx”(x为数字),并且弹出广告窗口。2 ?8 W' c( I0 v3 r. V+ C" r
很多人以为这是网站自己弹出的广告,也就没有在意。8 r1 w- w* s2 x: a; C( t9 ^5 f
& i$ A1 z: T' W我是属于很在意的那些人之一。
/ |3 C$ c9 @3 S2 ~9 F: O& ` - u5 G1 u9 |: @
2、这是怎么回事?# `( G* a' v8 D- c6 r
% A/ j* v! u- {0 s' _% b
经过测试和分析,我们发现,上述现象与使用何种浏览器无关(我们测试了各种流行的http客户端),
( W" I" Y3 X% S# Z" T$ v与使用何种操作系统也无关(linux用户也有相关报告)。
9 _1 e% z" A9 a' r8 Q! J8 n我对出现该现象的IE浏览器进程进行了跟踪调试,没有发现任何异常。可以断定,并不是系统被安装了adware或者spyware。
; t0 [3 G0 |6 O* V
* ^4 ?0 f: H9 Q- Y6 q! S6 K那么是不是那些网站自己做的呢?后来发现,访问我们自己管理的网站时也出现了这种情况,排除了这个可能。8 T9 [/ W8 M* a2 ?
$ d6 i0 x5 t9 z& J# l6 m
那么剩下唯一的可能就是:有人在某个或某几个关键网络节点上安装了inject设备,+ f5 ?& f( a; B+ G" D
劫持了我们的HTTP会话——我实在是不愿相信这个答案,这个无耻、龌龊的答案。
* f9 ^. l2 ]% Y" g1 F
2 A% X0 g/ ?$ h. J伟大的谢洛克·福尔摩斯说过:当其他可能都被排除之后,剩下的,即使再怎么不可思议,也一定是答案。9 I# k; Z/ w, F# G) F* n) c! h
- G3 ^3 P/ Z3 P, e. T为了验证这个想法,我选择了一个曾经出现过上述现象的网站附近网段的某个IP。
1 z( M2 F$ |7 Z3 r$ N直接访问这个IP的HTTP服务,正常情况下是没有页面的,应该返回 404错误。* ]1 @' s' _% H( w8 g2 i
我写了一个脚本。不断访问这个IP,同时记录进出的数据包。- {- _& i# r" c6 ^5 Y
在访问进行了120次的时候,结束请求,查看数据。120次请求中,118次返回的都是正常的404错误:: X8 \# \8 U* y
HTTP/1.1 404 Object Not Found
: S5 ]/ ~! X" h, z; k3 s c8 m0 JServer: Microsoft-IIS/5.0
: a, W& q$ ]2 g! R# h' YDate: Mon, 19 Jul 2004 12:57:37 GMT0 t* I" s* E g' [, T }- A; B! ~
Connection: close' ~% N+ W( R6 k6 d' ~& \
Content-Type: text/html5 [* |2 C5 R: \0 x8 p" k. M
Content-Length: 111
) J0 C# A; i, G, O〈html〉〈head〉〈title〉Site Not Found〈/title〉〈/head〉2 \2 b" ^' J2 L1 M& I
〈body〉No web site is configured at this address.〈/body〉〈/html〉
^9 B( j% X, X6 n$ W' x* @9 O - S( R+ W4 D$ A1 p- Z
但是有两次,返回了这个:
$ y) @9 s: x8 K: `" [HTTP/1.1 200 OK
) i$ l- @1 t i6 [Content-type: text/html0 i# N& J9 e# r2 I
〈html〉
7 N9 m7 E' d0 l6 s# [% n〈meta http-equiv='Pragma' content='no-cache'〉1 F! X$ O2 a% t* s) a4 H
〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉# \: ^, U! n; J4 J- H( d, T
〈script〉. G1 |+ P) J# X
window.open('http://211.147.5.121/DXT06-005.htm', '', 'width=400,height=330');
# _- Y( e! L6 P' {4 \〈/script〉
+ g& N: t. M; `4 n8 w〈head〉
8 R7 U. G8 k' b3 N; R# w( Q〈title〉〈/title〉
& t& {7 N4 x" h7 g- G〈/head〉
. @ }: M9 M: A& U" r〈body〉% P: c4 }+ y* M! Z; ~
〈/body〉/ l/ R7 O1 F* A9 n& ~( Z& J; u
〈/html〉. \: D9 X+ M% X f: R5 ]: }
4 Y& ^8 E' }5 A
更进一步分析数据包,可知劫持流程如下:) n/ N! ]# N' w: ~, q0 I) |1 P
+ O' A" P; [3 g! E6 g4 RA、在某个骨干路由器的边上,躺着一台旁路的设备,监听所有流过的HTTP会话。
0 j* h0 @2 ]6 Z4 j7 L这个设备按照某种规律,对于某些HTTP请求进行特殊处理。) Y# c6 k2 F' E. P
3 I1 \, E u+ \ F$ j. o
B、当一个不幸的HTTP请求流过,这个设备根据该请求的seq和ack,把早已准备好的数据作为回应包,发送给客户端。1 S. o2 H4 B$ r& J
这个过程是非常快的。我们的 HTTP请求发出之后,仅过了0.008秒,就收到了上面的回应。+ Q0 W2 D; p& h0 @- j' Y
而任何正常的服务器都不可能在这么短的时间内做出回应。
& \7 Y- t/ F3 Y
" N" |4 Q. k/ ?$ @+ u9 |. ~C、因为seq和ack已经被伪造的回应用掉了,所以,真正的服务器端数据过来的时候,会被当作错误的报文而不被接受。
0 ^% f4 @ E0 n* n6 i 7 J9 b( a$ S8 |0 B5 X, M9 m8 l
D、浏览器会根据〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉这一行,* d D- d9 K3 X6 ?7 \: G
重新对你要访问的URL进行请求,这一次,得到了请求的真正页面,并且调用window.open函数打开广告窗口。 _: t: z/ j5 Y3 N- M. n( x9 F
. p, t- f/ v9 y: a
在google中以“php?curtime”、“htm?curtime”、“asp?curtime”为关键字搜索,出现的基本上是国内网站,
( b: }. i( _5 l6 \5 i P3 K* X这表明,问题出在国内。用于inject的设备插在国内的某个或某几个大节点上。' k6 `/ X: k! L6 y u
/ _; y1 i, a X3 E, N
真相大白。我们被愚弄了,全中国的网民都成了某些人的赚钱工具。
# K% `% |# J+ A0 C3 ?
% W5 M) Y( s' ~2 J3、现在怎么办?2 ^- J* M# R* o( ^8 R
& z( L- W' ^$ M4 ^! W! O/ D2 U0 R
在坏家伙被捉出来之前,我们要想不受这个玩意的骚扰,可以考虑下面的方法:7 g; O9 w/ h+ V' F0 n. {
% j! ?9 Z" H* H. v$ T+ `$ qA、请各单位的网络管理员,在网络的边界设备上,完全封锁211.147.5.121。
: N) \6 s& u$ N 3 i) P0 ?2 ^: y* H: _
B、在你自己的个人防火墙上,完全封锁211.147.5.121。
. ~2 k& |- p4 N4 p6 _ % f# q0 X; h: J
C、如果你的浏览器是FireFox、Opera、GreenBrowser、或者MyIE,可以把“http://211.147.5.121/*”丢到弹出窗口过滤列表中去。
" P" c& S7 ^1 a ^; p+ d
7 |8 |! ]# J3 K8 o4 b' U绝不只是广告那么简单,这涉及到我们的选择,我们的自由,这比垃圾邮件更加肮脏和无耻。
6 S6 L+ ^ X4 ?& `4 G( B6 \今天是广告,明天就可能在你下载软件的时候给你加个adware或者加个病毒进去,谁知道呢?
. i s7 x5 ?% p5 V7 A# t, V我们的HTTP通信完全控制在别人手里。* A2 \1 `. ?) k8 x
2 B( G0 c) b$ D v# C- V" u4、如何把坏家伙揪出来?0 ?5 T+ e$ {# a; Q; q. d
. y% A" P& L/ \5 G
如果你是一个有权力调查和处理这件事的人,从技术上,可以考虑下面的手段:
7 ?4 H8 Y4 r! X% ?) b7 o - ]+ s* E$ K" U5 p# N6 \( k8 r8 N1 l
方法1:9 i6 H+ o; B$ F+ f1 N B
% |9 Z7 A! a" g8 @伪造的回应数据中并没有处理TTL,也就是说,我们得到的回应数据中TTL是和inject设备位置相关的。
: \* y' {: o0 u0 B t以我收到的数据包为例,真实的服务器端回应 TTL是107,伪造的回应TTL是53。" {7 N+ P9 s, p! S8 {; B
那么,从我们这里到被请求的服务器之间经过了21(128-107)个节点,从我们这里到inject设备经过了11(64-53)个节点。
8 V8 K4 P) V/ S, `. R: _' a只需要traceroute一下请求的服务器,得到路由回溯,往外数第11个节点就是安插inject设备的地方!7 d: z% @0 t- J* n! Z9 x6 M2 c+ N
# Y6 N i' Q- Q* ^; f
方法2:' v0 l/ |$ D! L" a) C
" P8 W$ W/ ]' ~* K+ v' a
假如坏家伙也看到了这篇文章,修改了TTL,我们仍然有办法。
# [) s. ^% x- e* u! w在google上以下面这些关键字搜索:php?curtime,htm? curtime,asp?curtime,可以得到大量访问时会被inject的网址。( o4 @0 v% w/ {& I1 `0 o8 ^, W
编写脚本反复访问这些网址,验证从你的ip访问过去是否会被 inject.将确实会被inject的结果搜集起来,
; z3 r8 h' ?5 ]0 S) j在不同的网络接入点上挨个用traceroute工具进行路由回溯。分析回溯的结果。1 k2 `, L6 u$ e' X: {+ u8 w+ P
$ }; w! u* c$ T# B( j T
上面我们已经说明了,坏家伙是在某个或者某些重要节点上安插了inject设备,
6 N M. u% w# K那么这个节点必然在被inject的那些网址到我们的IP之间的某个位置上。2 |5 y/ E& h, n. g% i0 d7 u
例如有A、B、C、D四个被inject到的网站,从四个地方进行路由回溯的结果如下:
! Z$ O& [5 ^, J' D. Q RMyIP-12-13-14-15-65-[89]-15-57-A
! N/ ^ n" F: J% f' m2 |! WMyIP-66-67-68-69-85-[89]-45-68-84-52-44-B
\* y. @- c& R, [( }& GMyIP-34-34-36-28-83-[89]-45-63-58-64-48-41-87-C7 ]* g* t3 A4 h* P# }# ?; L
MyIP-22-25-29-32-65-45-[89]-58-D
2 P2 }4 A$ P& ^! U; V! y& b
. U7 ~* @" r: _1 {5 S显然,inject设备极大可能就在“89”所在的机房。
" r3 x: ~' }& c
, O# h9 G, R. F o/ ?$ h8 Q方法3:
& r$ a) P$ { D1 Q: a
" k+ g+ U9 G# K9 q另一方面,可以从存放广告业面的211.147.5.121这个IP入手,whois查询结果如下:
4 ^% S# G8 A0 jinetnum: 211.147.0.0 - 211.147.7.255
3 U2 m7 @+ v4 f# B9 {. y- lnetname: DYNEGY-COMMUNICATION: Q3 T; J% K8 I3 u1 `5 G7 `
descr: DYNEGY-COMMUNICATION
5 e( y/ w5 C- f: m& i, D+ k, E) j X' Hdescr: CO.LTD
' I. y$ K9 s: }0 Q% _3 bdescr: BEIJING
0 F9 g, W3 g/ ?country: CN
8 E3 B" K/ K( E/ ^; aadmin-c: PP40-AP% v F5 J3 v% s; m
tech-c: SD76-AP/ p0 W' F" ~" W# M9 b0 t% h
mnt-by: MAINT-CNNIC-AP
6 y/ v( b; } }, B9 Q( \changed: [email protected] 20011112
5 v8 \% ? i( K3 \status: ALLOCATED PORTABLE
$ }: H; q( }' v Csource: APNIC
- k- s& c+ C) h7 g% eperson: Pang Patrick
1 ^' S3 j: V; ]- i- ~nic-hdl: PP40-AP7 @- c# x7 P, \: F
e-mail: [email protected]
; W% Q' i' d3 I% P& Baddress: Fl./8, South Building, Bridge Mansion, No. 53! o& D- b- z0 u3 g, Y
phone: +86-10-63181513
f9 a- t5 b2 _+ ~fax-no: +86-10-63181597
5 }# W) i$ [% y2 h. Vcountry: CN
5 R% N4 ?; a6 L0 s! ?changed: [email protected] 20030304
/ D- V9 [0 H: }0 m X8 z+ Imnt-by: MAINT-CNNIC-AP+ A/ y! X) w' l
source: APNIC
/ ?. J6 G4 W8 e, R: y* _person: ShouLan Du/ Y( @2 R: d" j' |3 V6 [
address: Fl./8, South Building, Bridge Mansion, No. 53( Z& q! M$ f, b" e1 D: ?! E
country: CN* h" {4 L4 b" f4 V' t5 V
phone: +86-010-83160000
- z' @4 `* |' |8 j* E: Pfax-no: +86-010-831555289 w' z1 G7 Q3 g5 X8 \! Y. |
e-mail: [email protected]' O' U! j Q. m& U' D
nic-hdl: SD76-AP
% @* b4 O# P; Z& t- cmnt-by: MAINT-CNNIC-AP m0 X, f9 d, I+ }
changed: [email protected] 20020403
8 P0 @9 z, J7 y; ysource: APNIC$ c7 n2 d# C- l
% g; n& A$ D. ^) q9 l5、我为什么要写这篇文章?9 C" H R! m% n/ m3 X* s& E9 e6 e
! |. N7 \; x+ p6 V, w
新浪为我提供桃色新闻,我顺便看看新浪的广告,这是天经地义的;! | z; i# i* n' i4 b
或者我安装某某网站的广告条,某某网站付给我钱,这也是天经地义的。
% Q% X6 u! ], M) N9 {" S' |可是这个 211.147.5.121既不给我提供桃色新闻,又不给钱,却强迫我看广告,这就严重伤害了我脆弱而幼小的心灵。
( p. k% k( E+ |1 Y+ L' X* z9 c& E事实上,你可以敲诈克林斯·潘,强奸克里奥·佩德拉,咬死王阳明,挖成吉思汗墓,我都不会计较,
1 N! U( t% h" c/ f; ?: k, B但是现在你既然打搅了我的生活,我就不得不说几句了。1 e- R0 P h" S
4 o# {, u- N# ]1 G' m( I
6、我是谁?- y; w$ n+ M( x! M/ ^
- t: f2 y" U2 c0 K t
如果你知道MyName,又知道MyCount的话,那么,用下面这段perl可以得到:2f4f587a80c2dbbd870a46481b2b1882。0 `, Y3 A! i5 |( a' S5 f6 E
#!/usr/bin/perl -w
+ O$ ]6 S0 v& t% v, h* J" Z; }use Digest::MD5 qw(md5 md5_hex md5_base64);
) J; O$ T; [# H$name = 'MyName';4 ?5 {+ B: Y9 N- g: |
$count = MyCount;
; e/ `6 w" A; ~) M% l# Wfor ($i=0; $i〈$count; $i++)
$ i3 h, l# ^8 L4 j: y{
+ p# w' j2 y5 B: {% m$name = md5_hex($name);4 e0 s1 g A( ^" S
}
c$ G0 l4 X {2 u! Oprint $name;
$ Z& g$ T; l/ `# F/ F, w
' {0 K6 y( R4 |! r" ]以下签名,用于以后可能出现的关于此文的交流:
# E, D* g% |* H' c/ A1 x& C, |1 6631876c2aea042934a5c4aaeabb88e9
" b; w7 G( y E9 p2 @4 P2 a6a607b3bcff63980164d793ff61d1706 U0 g9 L& e+ [7 k( v; z
3 6a58e8148eb75ce9c592236ef66a3448
5 c: p, ?/ x( b2 n6 z7 ?: @+ a4 ded96d29f7b49d0dd3f9d17187356310
3 u- W6 p# d) l/ P, ~, N5 cc603145bb5901a0ec8ec815d83eea66 |