在剑盟看到的帖子,很值得玩味特此转来,建议新手就不用看了。
) ~# h8 L" {/ l8 o% C. |- J* o) `7 D" M
. P# R; k# P' v `; t# d............................................................................................................................................
/ P4 z' H: l/ v& n K1 d: L1 E$ E) M$ w
是谁控制了我们的浏览器?
) _, B( s! [- ~1、现象是什么?4 g" P% a9 }' J0 ]- _
+ E0 p6 W$ ^7 [* c/ B9 r" O大约从今年年初开始,很多人就发现,在浏览一些网站的时候,- C9 q0 N2 ^! v# L; ?
地址栏的url后面会被莫名其妙地加上“?curtime=xxxxxxxxxx”(x为数字),并且弹出广告窗口。- q# g. Z6 E! ~& O
很多人以为这是网站自己弹出的广告,也就没有在意。
( l0 E9 ]& g6 C% D, u) }( b
$ v( t7 s( I6 y. T9 b' y1 f我是属于很在意的那些人之一。
7 b& v% l6 ? ^3 a - M% B) g: n$ I" W/ u7 d2 h
2、这是怎么回事?
c }' ?3 P7 B& ^! j% J 1 o i/ F# Y1 b# A& z2 W
经过测试和分析,我们发现,上述现象与使用何种浏览器无关(我们测试了各种流行的http客户端),1 ^7 W( I: X, o- r6 `5 I
与使用何种操作系统也无关(linux用户也有相关报告)。
3 k i o! f5 s6 T+ _% Y我对出现该现象的IE浏览器进程进行了跟踪调试,没有发现任何异常。可以断定,并不是系统被安装了adware或者spyware。- W* A% Y$ w% c/ Q- ?( E7 G
0 o. k% h# B9 i; i7 n, v
那么是不是那些网站自己做的呢?后来发现,访问我们自己管理的网站时也出现了这种情况,排除了这个可能。
- S8 ~; P% c9 S x9 l4 R
: { N% b9 L+ i, o% v那么剩下唯一的可能就是:有人在某个或某几个关键网络节点上安装了inject设备,
) d4 Q% n3 g7 |# Q/ {5 [# ?劫持了我们的HTTP会话——我实在是不愿相信这个答案,这个无耻、龌龊的答案。# l9 S1 D% j. e; B' O5 x. ` a+ f. C
9 S# J: B( [3 Y0 y3 c, q4 P. ^" F7 x伟大的谢洛克·福尔摩斯说过:当其他可能都被排除之后,剩下的,即使再怎么不可思议,也一定是答案。
8 [1 B$ m9 q9 u8 J3 J. u3 A: V
& X6 X/ o9 G( d4 S, N; b; L, A4 }8 r# E为了验证这个想法,我选择了一个曾经出现过上述现象的网站附近网段的某个IP。" V4 `& b; R( T5 Q& z4 @* V
直接访问这个IP的HTTP服务,正常情况下是没有页面的,应该返回 404错误。1 [+ Y( N6 A; ]
我写了一个脚本。不断访问这个IP,同时记录进出的数据包。; p5 y4 o; c( J* p3 B
在访问进行了120次的时候,结束请求,查看数据。120次请求中,118次返回的都是正常的404错误:
! l5 W2 ?5 @3 ] V$ q' j2 y$ mHTTP/1.1 404 Object Not Found6 P5 I' F7 l+ X) O( s6 G
Server: Microsoft-IIS/5.0
2 N) F/ p* o3 s/ t" {2 ?) W V' GDate: Mon, 19 Jul 2004 12:57:37 GMT
e m9 Q) |6 J8 M' R) \$ tConnection: close
& v' B; e& ^" s: A5 L0 xContent-Type: text/html* t" {) q1 Z8 K/ B8 x, k
Content-Length: 1117 p( _8 K5 y8 l: ]: s+ W( q
〈html〉〈head〉〈title〉Site Not Found〈/title〉〈/head〉
: A, Q* I$ y+ W〈body〉No web site is configured at this address.〈/body〉〈/html〉% y; x* ]6 H. Z. _" ]3 ?% W j
+ ^6 r3 a8 A6 O: Q) ?但是有两次,返回了这个:
/ c& l+ {5 }- h2 cHTTP/1.1 200 OK
4 K- o- [/ _/ PContent-type: text/html
9 R' U, f0 p1 u! b0 O〈html〉& j* T. O1 [9 v' R" b' l( J
〈meta http-equiv='Pragma' content='no-cache'〉' K8 b5 j0 ?8 K4 h( d
〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉, z( }: N+ z/ ? u2 ^/ h
〈script〉9 X5 z8 ]/ z4 q9 A" p
window.open('http://211.147.5.121/DXT06-005.htm', '', 'width=400,height=330');
, M3 K7 E6 w; |+ |8 m" r〈/script〉8 U7 ~, W+ q3 S. g- ]0 @0 v
〈head〉. K. s! h/ T# J0 H: F3 D
〈title〉〈/title〉
. n5 @' a* f/ d0 m1 _〈/head〉
* R+ _( H, L/ F/ ?% B& i% l〈body〉3 q- \. }' t' W( ]
〈/body〉
: s5 ?, F8 ?( W1 `〈/html〉
: n3 D" t; `3 y4 \- L
p9 Y1 ~7 M8 ]4 v1 G! o9 f2 y更进一步分析数据包,可知劫持流程如下:
9 z: Q$ Y8 S8 f) d2 N+ }& a - [0 C. N4 F4 {# K' R% F, S
A、在某个骨干路由器的边上,躺着一台旁路的设备,监听所有流过的HTTP会话。
" X6 }/ p" _2 Z. r这个设备按照某种规律,对于某些HTTP请求进行特殊处理。9 I6 ]8 K6 V' q9 C1 e( _, l! @
& z/ i+ y e' g8 }0 m; I# d* H* DB、当一个不幸的HTTP请求流过,这个设备根据该请求的seq和ack,把早已准备好的数据作为回应包,发送给客户端。
5 k( i; R r+ c7 D这个过程是非常快的。我们的 HTTP请求发出之后,仅过了0.008秒,就收到了上面的回应。- P$ [2 F6 {# E4 l/ U" e5 `$ P
而任何正常的服务器都不可能在这么短的时间内做出回应。
" \* x. w: ?' l/ z. \4 _ ; L; j' |: Y& J, O! _! r2 g
C、因为seq和ack已经被伪造的回应用掉了,所以,真正的服务器端数据过来的时候,会被当作错误的报文而不被接受。
9 s2 k, B$ [6 \5 F. [ 3 ^1 X2 B) a2 u1 _
D、浏览器会根据〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉这一行,
& ]* ]1 V. h- @0 d$ h重新对你要访问的URL进行请求,这一次,得到了请求的真正页面,并且调用window.open函数打开广告窗口。
# O4 Z3 ~9 o- p& M) c & o& {( V2 b8 N
在google中以“php?curtime”、“htm?curtime”、“asp?curtime”为关键字搜索,出现的基本上是国内网站,; b- F% A9 { C; N; D
这表明,问题出在国内。用于inject的设备插在国内的某个或某几个大节点上。" z3 P5 w; h- X% H, P" Z
1 a; ~1 f& b+ ]
真相大白。我们被愚弄了,全中国的网民都成了某些人的赚钱工具。 @( O( v8 H2 J
& X" A: _; Q! }* j$ Z3、现在怎么办?
0 B6 \0 M' t- ]- t
) G0 e& y5 F5 \" M$ h在坏家伙被捉出来之前,我们要想不受这个玩意的骚扰,可以考虑下面的方法:# g% O1 c$ L! S' Z# F4 W5 l3 ?
7 @! s* Q9 ~# A+ |/ {A、请各单位的网络管理员,在网络的边界设备上,完全封锁211.147.5.121。 M' L0 Q4 x; s- C# D$ @$ D
# b6 W, K9 p1 \9 A( p) z1 |$ JB、在你自己的个人防火墙上,完全封锁211.147.5.121。
# o/ R: Z$ E8 \+ d& U4 @5 y0 q5 S $ K; ~/ U! K! }* v5 A
C、如果你的浏览器是FireFox、Opera、GreenBrowser、或者MyIE,可以把“http://211.147.5.121/*”丢到弹出窗口过滤列表中去。
( c9 C0 n5 o; @* Y# K / \8 B9 b9 T% r) \
绝不只是广告那么简单,这涉及到我们的选择,我们的自由,这比垃圾邮件更加肮脏和无耻。, J/ Q: y* }2 s. f Y
今天是广告,明天就可能在你下载软件的时候给你加个adware或者加个病毒进去,谁知道呢?
$ C& Y7 i) w1 R我们的HTTP通信完全控制在别人手里。8 s+ r4 S* y. a
* Q$ O1 @, N# V3 c+ {0 E% T4、如何把坏家伙揪出来?
4 t H7 Y3 z3 p' h
# q' A# u8 G. I: T& {如果你是一个有权力调查和处理这件事的人,从技术上,可以考虑下面的手段:
1 L0 K$ b' Y1 u' O `5 d
, N, i( }$ a% L) @方法1:$ ~! n$ y! p- Q. A9 K# u9 _
6 \7 w! @; ]3 j, V f& t% ^1 W7 R
伪造的回应数据中并没有处理TTL,也就是说,我们得到的回应数据中TTL是和inject设备位置相关的。
# i0 t4 l0 N2 V# b _以我收到的数据包为例,真实的服务器端回应 TTL是107,伪造的回应TTL是53。* n8 U y! g$ ^: |' q1 O0 W# a9 M
那么,从我们这里到被请求的服务器之间经过了21(128-107)个节点,从我们这里到inject设备经过了11(64-53)个节点。4 x9 w* S) B2 Q3 T5 n! t9 y; B! o
只需要traceroute一下请求的服务器,得到路由回溯,往外数第11个节点就是安插inject设备的地方!
4 T% |( v$ C: ~& u0 m3 t- k# P t. E0 P- J" Q- r; c
方法2:
% ^. g$ S' ?9 K' m( R0 {0 P
; d, B7 j& m! ~. B* L. T2 X3 k假如坏家伙也看到了这篇文章,修改了TTL,我们仍然有办法。% U5 l7 |( O# q* w0 [
在google上以下面这些关键字搜索:php?curtime,htm? curtime,asp?curtime,可以得到大量访问时会被inject的网址。1 v' U+ T4 a0 S% o
编写脚本反复访问这些网址,验证从你的ip访问过去是否会被 inject.将确实会被inject的结果搜集起来,3 n/ v+ n+ X1 T. i$ y6 L
在不同的网络接入点上挨个用traceroute工具进行路由回溯。分析回溯的结果。
2 o# y( n9 U e% l7 y
0 v2 }. L* G7 E( F C* }& Y上面我们已经说明了,坏家伙是在某个或者某些重要节点上安插了inject设备,/ d& n" i6 O) g$ C% q" Y# K
那么这个节点必然在被inject的那些网址到我们的IP之间的某个位置上。: z9 i! c6 J/ b$ i4 p, a/ ]
例如有A、B、C、D四个被inject到的网站,从四个地方进行路由回溯的结果如下:# k% {1 \$ q+ t- c0 V5 I
MyIP-12-13-14-15-65-[89]-15-57-A% V" v% n# B; T4 c, [" Q
MyIP-66-67-68-69-85-[89]-45-68-84-52-44-B6 |: ?3 H9 M" w
MyIP-34-34-36-28-83-[89]-45-63-58-64-48-41-87-C
/ ?4 _9 }/ P' D: i; ZMyIP-22-25-29-32-65-45-[89]-58-D
J5 f ?# W. ^% [* ?
8 L2 K$ `/ |: Y" V ^2 e显然,inject设备极大可能就在“89”所在的机房。
: n& S! L- E/ B+ i2 i8 ~
/ D4 n; V# V& h5 m方法3:
$ _, @# H; Z- k& v. q
6 ?3 v- _' R0 {# u v9 k" q8 l另一方面,可以从存放广告业面的211.147.5.121这个IP入手,whois查询结果如下:: I0 h4 `+ F; \: m% [6 G
inetnum: 211.147.0.0 - 211.147.7.2558 v) a8 ]7 N$ Z [7 B' h# F2 h
netname: DYNEGY-COMMUNICATION8 [" C! O1 J7 O# H) y
descr: DYNEGY-COMMUNICATION
9 |1 f, n$ [3 T0 j% c6 Idescr: CO.LTD
$ _- d) {$ w" k2 K$ X' Ndescr: BEIJING* d3 c9 a% z, T' R( O+ k0 v
country: CN
3 K7 E% i+ k& \/ ~admin-c: PP40-AP3 u9 s1 W+ B% A2 L& U0 i
tech-c: SD76-AP
5 {* i w5 P* Dmnt-by: MAINT-CNNIC-AP
/ {* ^; q: d' {) ^+ ochanged: [email protected] 20011112/ n6 E# g2 h2 ^. v1 k
status: ALLOCATED PORTABLE
" M* S: D$ |1 Z8 {source: APNIC
- B; f8 l" J: N; U$ k3 |( u" O" iperson: Pang Patrick
( n$ |* x* w' G" Bnic-hdl: PP40-AP
: K& O0 ]2 R" b( B8 `/ y Ke-mail: [email protected]8 C* G5 B" K$ h" V: |
address: Fl./8, South Building, Bridge Mansion, No. 53
: n2 H. }; E! r+ K+ ]" z" rphone: +86-10-63181513
5 L: c: d- Y1 M7 z9 xfax-no: +86-10-63181597; [+ E- ]8 r/ r& X
country: CN
( y+ ]' S$ c& X& t3 ?* y! k" pchanged: [email protected] 20030304& i: u2 P% ?! m; l! d) S) T; w
mnt-by: MAINT-CNNIC-AP, v* K' ?% g- v6 ?8 u5 [: Q
source: APNIC# H4 `- P0 l8 y( K. O' O% r; W; D
person: ShouLan Du3 U$ j( s- Q3 ^% {$ C: ?) C
address: Fl./8, South Building, Bridge Mansion, No. 53: }8 x6 R( @# h# Z4 o
country: CN$ ]: {+ ?4 G( M# P+ c/ |
phone: +86-010-83160000
7 E7 l9 k$ C7 p% f, nfax-no: +86-010-831555282 ]1 ]5 S' d, Q* S* t& W" g
e-mail: [email protected]+ s# m& g! X1 I/ Q6 J0 l; M
nic-hdl: SD76-AP, p R! \& O5 P3 g- g
mnt-by: MAINT-CNNIC-AP
* ^: \1 {2 X- n q$ k i, I$ L, gchanged: [email protected] 20020403; _$ [& Y7 P* E0 b+ s/ n# n% t
source: APNIC
: W# r# X! V$ G8 b4 d* f7 d# r
; j2 G7 w4 s: g }2 M# P5、我为什么要写这篇文章?
2 y- B# B o% [. x" B 2 b7 A: |4 h9 _& g% v% d
新浪为我提供桃色新闻,我顺便看看新浪的广告,这是天经地义的;: [/ b& I) \4 `
或者我安装某某网站的广告条,某某网站付给我钱,这也是天经地义的。
0 @% ~; M' t7 Q$ \可是这个 211.147.5.121既不给我提供桃色新闻,又不给钱,却强迫我看广告,这就严重伤害了我脆弱而幼小的心灵。
. l! j P3 J7 h) N; ]- `* ]事实上,你可以敲诈克林斯·潘,强奸克里奥·佩德拉,咬死王阳明,挖成吉思汗墓,我都不会计较,$ j0 d" i4 R- w# i9 K; \" U5 _
但是现在你既然打搅了我的生活,我就不得不说几句了。# K4 I2 I3 H" I8 d8 e
6 i1 V/ p4 r6 W3 h& f" `2 G' U# _( ~0 I
6、我是谁?/ {/ |) ~/ I7 C
6 _: f8 u2 }* R3 Y8 ?: B; D9 C
如果你知道MyName,又知道MyCount的话,那么,用下面这段perl可以得到:2f4f587a80c2dbbd870a46481b2b1882。7 r( i6 E6 e% T
#!/usr/bin/perl -w
. T* _" x S) ^+ c) ^' ^use Digest::MD5 qw(md5 md5_hex md5_base64);
- P1 \3 R/ B$ {; k; v2 g1 w# h g L$name = 'MyName';
8 ^) J( S1 w/ {0 K7 n: L( c$count = MyCount;
' C8 F3 z1 w) y. ?3 m" p: d- Rfor ($i=0; $i〈$count; $i++); {* P5 u$ h& G4 E
{" `4 E! k& K4 z6 \" \& d. m( n
$name = md5_hex($name);- v4 ^4 \9 ?9 p" c9 w2 F( ?
}
n5 f2 [ c% G" i! vprint $name; X5 j2 q1 ]7 B9 F$ C, ~. Q
: [# R1 ^& h7 J8 v以下签名,用于以后可能出现的关于此文的交流:
O9 l$ e! ?8 o1 6631876c2aea042934a5c4aaeabb88e9
6 v. d: I3 k3 A T! {# A9 K2 a6a607b3bcff63980164d793ff61d170! t9 A- D4 a; h% P6 N
3 6a58e8148eb75ce9c592236ef66a3448$ i! X$ M }% {. V; R5 l* G9 B
4 ded96d29f7b49d0dd3f9d17187356310) w& x# N* K: ^8 D( N
5 cc603145bb5901a0ec8ec815d83eea66 |