在剑盟看到的帖子,很值得玩味特此转来,建议新手就不用看了。
+ z& b" g3 `+ l: C8 S' r0 S! }0 _! N3 O% s
# I6 Y" k4 Q) H/ @. k............................................................................................................................................
" ~) O7 B, `3 y
! b( Y. d" n; @; C是谁控制了我们的浏览器?! l/ }* @# f( y0 O( ^ n! e$ m
1、现象是什么?" w3 Z7 H" B% A, o7 ?+ }4 r2 D
; M3 F+ H2 F. d( @# F* K4 K% ?7 i5 L大约从今年年初开始,很多人就发现,在浏览一些网站的时候,! K7 T2 r; R0 r$ ~! e' f' }
地址栏的url后面会被莫名其妙地加上“?curtime=xxxxxxxxxx”(x为数字),并且弹出广告窗口。& z9 U! Z5 H- K2 K
很多人以为这是网站自己弹出的广告,也就没有在意。( o w) s. N5 q k# x3 M
* D6 T% b0 Q- n+ O我是属于很在意的那些人之一。
) K& U$ b: r. K, K; T + `- \+ {- |& l7 @, w, U) d4 m
2、这是怎么回事?
4 j' ?3 L0 X4 Y5 `& R6 [, l8 b
- a0 x+ S3 y0 t. v/ \# y H经过测试和分析,我们发现,上述现象与使用何种浏览器无关(我们测试了各种流行的http客户端),
! L9 I# P: y9 g6 o2 @与使用何种操作系统也无关(linux用户也有相关报告)。- n7 I; l# @2 A# z% p5 d- _
我对出现该现象的IE浏览器进程进行了跟踪调试,没有发现任何异常。可以断定,并不是系统被安装了adware或者spyware。
- w" B" T u2 D) s
1 n. \+ G/ p9 a0 x1 }1 U那么是不是那些网站自己做的呢?后来发现,访问我们自己管理的网站时也出现了这种情况,排除了这个可能。
; |( _8 M7 h1 I7 ^3 A# l* W
! B& W( B1 ?8 _& W1 L3 D4 o' w) y那么剩下唯一的可能就是:有人在某个或某几个关键网络节点上安装了inject设备,
+ C& N9 |; P% z0 g劫持了我们的HTTP会话——我实在是不愿相信这个答案,这个无耻、龌龊的答案。) r3 E7 ?) |4 S
8 p! h8 }7 n4 ^$ a' R+ v伟大的谢洛克·福尔摩斯说过:当其他可能都被排除之后,剩下的,即使再怎么不可思议,也一定是答案。- P @, [7 A+ \7 V9 z. F
. Y9 q3 S6 E: I8 O
为了验证这个想法,我选择了一个曾经出现过上述现象的网站附近网段的某个IP。. ] G1 k* D7 Y) z: h0 i
直接访问这个IP的HTTP服务,正常情况下是没有页面的,应该返回 404错误。
% @ T/ D' z2 b# X# `, p3 B我写了一个脚本。不断访问这个IP,同时记录进出的数据包。
" ]- @. y: q5 _3 N/ t在访问进行了120次的时候,结束请求,查看数据。120次请求中,118次返回的都是正常的404错误:8 @: Y( w9 C9 l( F0 `
HTTP/1.1 404 Object Not Found8 [) o' ?* e4 ~1 `) d4 h8 L
Server: Microsoft-IIS/5.0* G- S# V) T! l4 }6 o R5 X/ I! G2 [
Date: Mon, 19 Jul 2004 12:57:37 GMT
2 a9 f9 C2 e, ]: u5 T$ {Connection: close
" b& w% S5 C+ _1 O3 ^Content-Type: text/html
5 R1 p( R: s d/ {Content-Length: 111; t2 U( f v! X2 }6 H
〈html〉〈head〉〈title〉Site Not Found〈/title〉〈/head〉' I! j4 o! p% u A/ v1 D
〈body〉No web site is configured at this address.〈/body〉〈/html〉
3 ~% p& C4 L+ C; g2 x& x$ |' z' X . q* F8 j2 o# ]' f5 M, N
但是有两次,返回了这个:
. `* ^/ w6 ]5 s7 U$ |& ?- W' SHTTP/1.1 200 OK6 u" f3 S/ P1 O
Content-type: text/html
: y$ x( i# e7 T1 z2 ~& X f〈html〉
6 r" x4 I+ Q6 k# j〈meta http-equiv='Pragma' content='no-cache'〉- Z) ]6 D# H T4 S" n, X! |8 K
〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉: J, @5 _4 N V k0 R. z/ }
〈script〉, n% Y% o$ v7 N
window.open('http://211.147.5.121/DXT06-005.htm', '', 'width=400,height=330');+ j# v H8 C2 \4 E
〈/script〉+ E" c/ W. a! A' `* o5 S3 m
〈head〉2 [) H! b' ^. x# k, [
〈title〉〈/title〉
6 h# P. ?( q! G; V) {% Q; ~. W* X: a〈/head〉* } b: [4 G8 P5 l" }
〈body〉0 b! w* N! J, M9 L/ o5 O! I2 ~
〈/body〉: d6 u& \8 @& Z& j% \+ Q! K, q
〈/html〉
+ P% l% ]6 @3 O$ `% f* V- o4 q 5 E& o* B* G$ R; v0 S5 P' D
更进一步分析数据包,可知劫持流程如下:& J! |1 m7 u# l: j) t- D, B
! ^' Q' U2 @# C' O# @! G
A、在某个骨干路由器的边上,躺着一台旁路的设备,监听所有流过的HTTP会话。) |6 e$ C( |, ]4 z' O2 N
这个设备按照某种规律,对于某些HTTP请求进行特殊处理。# P. [: u9 ^. _; T' H
0 s/ C" F8 h, O! Y6 u( x9 OB、当一个不幸的HTTP请求流过,这个设备根据该请求的seq和ack,把早已准备好的数据作为回应包,发送给客户端。
# x5 r+ L4 I, Q' T这个过程是非常快的。我们的 HTTP请求发出之后,仅过了0.008秒,就收到了上面的回应。: `+ u8 v. b( C8 T- G/ H
而任何正常的服务器都不可能在这么短的时间内做出回应。6 d) T& y. [% B" T4 ]
% T4 k: v% E/ P0 _; M! i. Y' UC、因为seq和ack已经被伪造的回应用掉了,所以,真正的服务器端数据过来的时候,会被当作错误的报文而不被接受。
6 ~4 M4 c+ o7 M+ a# i7 B' U 0 W4 ?" l9 v8 k1 l# s" ~
D、浏览器会根据〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉这一行,
t+ j" ~0 t6 A3 J, {重新对你要访问的URL进行请求,这一次,得到了请求的真正页面,并且调用window.open函数打开广告窗口。8 J# W4 M: \8 ~. {5 A! A0 m
Y$ F% _) Z' b+ F8 w
在google中以“php?curtime”、“htm?curtime”、“asp?curtime”为关键字搜索,出现的基本上是国内网站,
5 \+ x$ j) G' Z( l$ b5 m ?9 Z4 y! Q( n这表明,问题出在国内。用于inject的设备插在国内的某个或某几个大节点上。* l# {' k4 l6 `3 p. t# r5 z
2 \ W0 U, W( O6 h. }真相大白。我们被愚弄了,全中国的网民都成了某些人的赚钱工具。6 t( z7 }5 H! B
& a4 y& W8 K' Y! j& C- p) [
3、现在怎么办?- d; [0 ]9 k/ ?$ C c
1 U2 A- c$ F8 L% G. Q
在坏家伙被捉出来之前,我们要想不受这个玩意的骚扰,可以考虑下面的方法:
6 D. G# D7 X% K1 x$ j O. s5 d
# @/ B! m$ \8 B3 y5 J6 \A、请各单位的网络管理员,在网络的边界设备上,完全封锁211.147.5.121。 s1 p- a; i* `! t# z9 l
) B" t9 l3 }, v1 {$ t3 n" \2 U; x
B、在你自己的个人防火墙上,完全封锁211.147.5.121。9 }; m6 a% g- f
) q h( X9 q4 j; X# E0 p: c$ o6 `
C、如果你的浏览器是FireFox、Opera、GreenBrowser、或者MyIE,可以把“http://211.147.5.121/*”丢到弹出窗口过滤列表中去。, R0 r& _8 j* F. }3 s* x% M2 Z
) r. c( F9 Y5 r5 k
绝不只是广告那么简单,这涉及到我们的选择,我们的自由,这比垃圾邮件更加肮脏和无耻。
. c1 d' K5 R0 @2 e- U/ e' { F今天是广告,明天就可能在你下载软件的时候给你加个adware或者加个病毒进去,谁知道呢?+ l$ s$ i; n0 a* S2 a; H" ]
我们的HTTP通信完全控制在别人手里。
) L2 B2 F a5 Q3 z K % K8 [/ g' n& K
4、如何把坏家伙揪出来?
0 T4 }6 V( \6 n! @. P( Z
" U- |" D) d: A" s% A- J如果你是一个有权力调查和处理这件事的人,从技术上,可以考虑下面的手段:
' ?( T. o0 g' M: s; I" m( p+ ?
9 \3 g. T7 p/ {方法1:
; l( I* d: t" {0 y
7 ^+ O2 V5 B2 O! T伪造的回应数据中并没有处理TTL,也就是说,我们得到的回应数据中TTL是和inject设备位置相关的。. m. `' U y: j1 s, C3 x$ d
以我收到的数据包为例,真实的服务器端回应 TTL是107,伪造的回应TTL是53。7 C) z% p4 J& \
那么,从我们这里到被请求的服务器之间经过了21(128-107)个节点,从我们这里到inject设备经过了11(64-53)个节点。3 | G* r) u' B' ~- A
只需要traceroute一下请求的服务器,得到路由回溯,往外数第11个节点就是安插inject设备的地方!
1 v8 i9 r& k6 F4 d9 f
1 \: V% b( f" i1 B# \方法2:
& p7 h9 f* a2 l% P! n
, @( w# h8 C4 \0 |$ u假如坏家伙也看到了这篇文章,修改了TTL,我们仍然有办法。4 c8 i* Q& t# O. w1 S
在google上以下面这些关键字搜索:php?curtime,htm? curtime,asp?curtime,可以得到大量访问时会被inject的网址。0 N5 Q, [4 m& I
编写脚本反复访问这些网址,验证从你的ip访问过去是否会被 inject.将确实会被inject的结果搜集起来," p9 s' b/ b5 b- n+ |8 H) i
在不同的网络接入点上挨个用traceroute工具进行路由回溯。分析回溯的结果。% R$ s) L* c# M- h. Z* w
/ H& s/ c6 a. c6 U& X上面我们已经说明了,坏家伙是在某个或者某些重要节点上安插了inject设备,
( ?) c3 M& W: W那么这个节点必然在被inject的那些网址到我们的IP之间的某个位置上。) ^/ u V& C3 M6 f" h
例如有A、B、C、D四个被inject到的网站,从四个地方进行路由回溯的结果如下:
) g8 D9 I6 r9 P+ yMyIP-12-13-14-15-65-[89]-15-57-A
7 x7 s- x% j7 x! ^4 ^MyIP-66-67-68-69-85-[89]-45-68-84-52-44-B! r' ?' h9 K V9 K, ]( ]* ?! c
MyIP-34-34-36-28-83-[89]-45-63-58-64-48-41-87-C) [( T3 B# Z- y; d& J8 ^
MyIP-22-25-29-32-65-45-[89]-58-D2 y$ ^% e+ |( u
% I, l+ r# Q1 d0 b/ i- T% S显然,inject设备极大可能就在“89”所在的机房。 u+ ~7 m" ]3 N; }) x3 a# |
8 D! v. }6 z+ ]3 ^9 A
方法3:1 W$ t& }8 N* d) E0 {; S
/ o6 ]$ V9 b1 W另一方面,可以从存放广告业面的211.147.5.121这个IP入手,whois查询结果如下:3 v' e# Y8 B0 \; @
inetnum: 211.147.0.0 - 211.147.7.255" D) H4 [4 Q) S& a7 e
netname: DYNEGY-COMMUNICATION- k. k& w* d8 F' D' w) y+ V
descr: DYNEGY-COMMUNICATION2 k) N0 j) L; M: y5 W7 l2 `! [
descr: CO.LTD) z* y5 |3 K( Z. B2 w- X
descr: BEIJING
7 ], e' U$ T( ocountry: CN9 m# G7 L* ?7 I$ h$ B/ x. z
admin-c: PP40-AP
! S! l. n4 p0 }3 c jtech-c: SD76-AP
5 d7 Q9 V$ z% X# ?) H. q, Amnt-by: MAINT-CNNIC-AP1 t. b& I- ~) J d+ q0 @6 k
changed: [email protected] 200111123 E8 |5 x( E U1 K% X
status: ALLOCATED PORTABLE
* ]) l4 f1 `4 I/ {( p, _source: APNIC
2 q; |8 |2 w7 T" J; Z9 I( Kperson: Pang Patrick9 B2 _) T- S5 G6 \7 r9 Y; o
nic-hdl: PP40-AP
/ y; r6 Z- o x! L: d# a le-mail: [email protected]( d$ t+ U# l( o3 t1 Y7 c
address: Fl./8, South Building, Bridge Mansion, No. 53, b0 @" {# ?4 n3 r8 P$ D$ M$ H$ H0 P6 ]
phone: +86-10-63181513+ O+ @- X- M/ B8 R+ R
fax-no: +86-10-63181597; Y* p; R6 U' V# f7 a
country: CN4 ?/ j4 Z3 c) z- T. x* i
changed: [email protected] 20030304
# [/ u) i ]9 p8 |3 a6 J4 i$ f2 d' _mnt-by: MAINT-CNNIC-AP( x7 h& z8 g. o- X0 d2 [
source: APNIC
, Q2 F1 ^4 ]' K- Eperson: ShouLan Du
' J6 i4 E4 _! b! d, k. ]; H2 eaddress: Fl./8, South Building, Bridge Mansion, No. 53
6 @% o5 @2 X( jcountry: CN0 T( {; j4 C7 T. [3 Y. {
phone: +86-010-83160000
1 B$ \0 v6 f$ q2 D8 e4 Rfax-no: +86-010-83155528; Y* x1 b4 J' h! e
e-mail: [email protected]
) ^) [( p8 F2 o! s! L( w5 wnic-hdl: SD76-AP
3 s$ ~& E* B) O( E4 j6 Imnt-by: MAINT-CNNIC-AP
6 O. i2 E* O( ]5 {1 L, }( d Hchanged: [email protected] 20020403$ y% E C! I7 V
source: APNIC
& _, p: ~& L$ f( s* r& B: p & R6 d8 {8 X& q9 j
5、我为什么要写这篇文章?
0 c; s5 b: l1 I. Y# C * T$ ~, o w9 Y, I( S) w0 u
新浪为我提供桃色新闻,我顺便看看新浪的广告,这是天经地义的;
3 L5 g U1 l4 q或者我安装某某网站的广告条,某某网站付给我钱,这也是天经地义的。5 s' Y- m8 I" N, N0 U$ r
可是这个 211.147.5.121既不给我提供桃色新闻,又不给钱,却强迫我看广告,这就严重伤害了我脆弱而幼小的心灵。
* }$ m }9 h; P$ l, j4 I9 E事实上,你可以敲诈克林斯·潘,强奸克里奥·佩德拉,咬死王阳明,挖成吉思汗墓,我都不会计较,
, ?- a8 q/ H) P$ G' j但是现在你既然打搅了我的生活,我就不得不说几句了。+ X P. T9 \& t
/ x8 x6 G) J* f
6、我是谁?
/ J8 ~# y' T/ K$ C& ~3 q
# W$ { j5 ]8 N' }) c如果你知道MyName,又知道MyCount的话,那么,用下面这段perl可以得到:2f4f587a80c2dbbd870a46481b2b1882。
2 T+ V! M/ K5 i$ `+ Y#!/usr/bin/perl -w# w. {: _% f7 j& P7 u
use Digest::MD5 qw(md5 md5_hex md5_base64);
5 R2 g$ l* ~5 I9 j$ @ ]. b7 `7 I$name = 'MyName';
& s, H- \& v% T- E; d$count = MyCount;
: h; K# ]; L% jfor ($i=0; $i〈$count; $i++)
9 f/ `0 b0 @; A6 Y8 k{! ]# M3 H4 m3 ~' U) s0 v
$name = md5_hex($name);9 v0 G& l5 a! H3 X+ Z u: ^9 g
}/ ^7 y, B7 I" s6 p) T& u4 `/ b
print $name;
$ b3 C1 h! Q2 j6 T3 g5 ?' X& t" @ % ?4 D# I) F+ x
以下签名,用于以后可能出现的关于此文的交流:
, B; H. ~2 D8 u( u7 b9 C3 G1 6631876c2aea042934a5c4aaeabb88e9
8 V1 y+ j; a' b2 O( |# s$ ~4 `2 a6a607b3bcff63980164d793ff61d1706 l5 n4 D7 ?* C
3 6a58e8148eb75ce9c592236ef66a3448
8 M( z, v: n, B& g1 Q; s4 ded96d29f7b49d0dd3f9d17187356310
$ o4 i) c+ C$ e! O. J: ]5 cc603145bb5901a0ec8ec815d83eea66 |