在剑盟看到的帖子,很值得玩味特此转来,建议新手就不用看了。% N) |* L. ?* Z2 w4 ?% N( ?7 o- \
3 s" t1 m7 U" Z( h. q7 d5 G, ]
' \ H' o: u7 V
............................................................................................................................................, U1 a) t7 c6 F. }) O: a& O
$ `: ~ H3 O( ?是谁控制了我们的浏览器?* J& f: o% n, z( z
1、现象是什么?
; ?8 M6 W& z; M 3 q2 Q8 |6 o; _7 v: q: N
大约从今年年初开始,很多人就发现,在浏览一些网站的时候,
$ e& j; D* @* V' I0 S地址栏的url后面会被莫名其妙地加上“?curtime=xxxxxxxxxx”(x为数字),并且弹出广告窗口。5 l1 s# D: n& I1 A3 n
很多人以为这是网站自己弹出的广告,也就没有在意。; c3 e( y8 D! d( `; t( y. D1 I3 p
4 k- Q* A7 v2 s我是属于很在意的那些人之一。
3 K) I- v# x4 z2 \ . ~: x2 Q& n) w: d8 | d$ Q
2、这是怎么回事?
& R+ Z8 G+ o: ~4 [ o* r2 P- W ; N; y0 k% i0 `
经过测试和分析,我们发现,上述现象与使用何种浏览器无关(我们测试了各种流行的http客户端),
$ J: I5 p; _' ~) K& F; B与使用何种操作系统也无关(linux用户也有相关报告)。# N- i$ N9 P: V6 V# U7 i# b
我对出现该现象的IE浏览器进程进行了跟踪调试,没有发现任何异常。可以断定,并不是系统被安装了adware或者spyware。
) c J/ k) @) R7 y5 P6 S3 i. I
' r2 k1 J. c1 t那么是不是那些网站自己做的呢?后来发现,访问我们自己管理的网站时也出现了这种情况,排除了这个可能。! E4 F* R) K0 E0 ^$ P! k
0 v3 z4 x8 f0 s2 |. s% w. b
那么剩下唯一的可能就是:有人在某个或某几个关键网络节点上安装了inject设备,
0 ]% O, Q2 V! g劫持了我们的HTTP会话——我实在是不愿相信这个答案,这个无耻、龌龊的答案。
$ \# _% I2 \, X5 B! { " W% u6 @) H$ e# W2 B
伟大的谢洛克·福尔摩斯说过:当其他可能都被排除之后,剩下的,即使再怎么不可思议,也一定是答案。2 Q) w7 G, [1 L8 d6 `9 D
9 Y: r( v% U) i* W9 F为了验证这个想法,我选择了一个曾经出现过上述现象的网站附近网段的某个IP。6 h( p! @) `/ p9 m1 D
直接访问这个IP的HTTP服务,正常情况下是没有页面的,应该返回 404错误。" o2 S8 t* w6 T3 F
我写了一个脚本。不断访问这个IP,同时记录进出的数据包。& d8 `% R$ w! s0 K3 P2 W
在访问进行了120次的时候,结束请求,查看数据。120次请求中,118次返回的都是正常的404错误:
: j4 @1 e: T. c- ?6 rHTTP/1.1 404 Object Not Found
; ]4 ~( R7 D1 j/ p% g2 pServer: Microsoft-IIS/5.07 j# s) q( B& n* l% L, I/ ]; u
Date: Mon, 19 Jul 2004 12:57:37 GMT- i2 {$ f. q: s2 h6 R
Connection: close2 O- q4 X! C6 N7 i
Content-Type: text/html
/ s$ d0 Q: K5 jContent-Length: 111
6 m! ?$ q" N- [* u# W〈html〉〈head〉〈title〉Site Not Found〈/title〉〈/head〉
+ _6 Z4 ?, ~' \〈body〉No web site is configured at this address.〈/body〉〈/html〉; \ G5 x& E$ q; ` |' M0 B0 P
7 j g. P, H5 I, A& w8 o! s
但是有两次,返回了这个:( X, o0 G5 M' }' M* q" l: N
HTTP/1.1 200 OK) Z4 g% e7 ?* @1 p3 O* g
Content-type: text/html) F( G+ z% {$ |3 m% J+ u
〈html〉
" V/ z' w( b w L; Y〈meta http-equiv='Pragma' content='no-cache'〉6 B4 }; x. B/ S# M2 P# ^! d- ?
〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉
8 r9 s4 y. N. Y9 z〈script〉
! O$ ]7 p* d: I0 g! ]- |- F cwindow.open('http://211.147.5.121/DXT06-005.htm', '', 'width=400,height=330');
a; v& F/ l9 J8 {〈/script〉
8 ^9 n1 e0 W4 q5 b6 w〈head〉
4 }, N/ [5 \; _( M# Y〈title〉〈/title〉
8 ~- e; g( M9 e( O! Z5 j* P9 R〈/head〉8 |. T; h- e1 B& j
〈body〉
) I8 G! b2 D, F6 M0 F〈/body〉6 u) w8 ? h6 S4 ]$ _
〈/html〉* m, k) O& g& s4 Z6 h0 e
: T* L# }' s, W3 d6 W7 P
更进一步分析数据包,可知劫持流程如下:; K4 g' u5 u7 a5 ]) t$ G
$ Z3 E8 {" v5 w4 `: Q+ u
A、在某个骨干路由器的边上,躺着一台旁路的设备,监听所有流过的HTTP会话。
+ S+ S% {* r# \- p( a6 ^这个设备按照某种规律,对于某些HTTP请求进行特殊处理。 i! m8 G( M/ u* T/ w
3 u b/ o& [" a$ _, Z, fB、当一个不幸的HTTP请求流过,这个设备根据该请求的seq和ack,把早已准备好的数据作为回应包,发送给客户端。, ^# C! O1 P3 i6 O" ?7 `4 b
这个过程是非常快的。我们的 HTTP请求发出之后,仅过了0.008秒,就收到了上面的回应。
3 S7 L) s8 Q: }0 p6 u) W5 p% _而任何正常的服务器都不可能在这么短的时间内做出回应。
; f- Z6 ?* w5 Q , w) X: L0 ]9 Q0 O4 \# i
C、因为seq和ack已经被伪造的回应用掉了,所以,真正的服务器端数据过来的时候,会被当作错误的报文而不被接受。* O+ q1 [3 D1 T# a4 M0 B
; Q6 q- _8 V& K4 u( s7 Z% D/ i
D、浏览器会根据〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉这一行,
0 _( M1 ?, F& v* s$ W1 ~重新对你要访问的URL进行请求,这一次,得到了请求的真正页面,并且调用window.open函数打开广告窗口。
; w U8 |" X& O5 u5 X* D d! |
) ~; ^ U5 i) f# n t! l3 P在google中以“php?curtime”、“htm?curtime”、“asp?curtime”为关键字搜索,出现的基本上是国内网站,
7 j8 ?. e; o' M2 g+ k8 r$ I/ Y" S这表明,问题出在国内。用于inject的设备插在国内的某个或某几个大节点上。' j) H( O. z0 w7 d6 f
N9 {0 m1 u) g, S; t7 [" Y, o1 N
真相大白。我们被愚弄了,全中国的网民都成了某些人的赚钱工具。- @$ e, s; [( c) C- d2 d! @+ f
/ b! z" L% a5 A* f8 v( A/ }3、现在怎么办?2 D" U1 o4 J0 x s
4 d( n3 O' L/ {
在坏家伙被捉出来之前,我们要想不受这个玩意的骚扰,可以考虑下面的方法:8 E9 w- M: Z5 d
/ v/ P& @/ c9 Q' t8 KA、请各单位的网络管理员,在网络的边界设备上,完全封锁211.147.5.121。
6 b8 e: X* e0 J8 j, o" `% Q / a1 w" @' ]$ a4 J4 \4 g, z' @4 t
B、在你自己的个人防火墙上,完全封锁211.147.5.121。
! H2 y+ T' E+ l1 E) U* U 9 F. y& b; V! E% j2 G
C、如果你的浏览器是FireFox、Opera、GreenBrowser、或者MyIE,可以把“http://211.147.5.121/*”丢到弹出窗口过滤列表中去。
6 L' H1 i5 N1 t4 B; v. ^2 N; S
; R! A. F0 X6 P/ L3 F- o绝不只是广告那么简单,这涉及到我们的选择,我们的自由,这比垃圾邮件更加肮脏和无耻。. k1 _: p$ T# p$ c
今天是广告,明天就可能在你下载软件的时候给你加个adware或者加个病毒进去,谁知道呢?
7 ?/ f6 D" m( v* b; Y我们的HTTP通信完全控制在别人手里。$ Q q$ u( u j
9 B0 A8 P1 Z3 G4、如何把坏家伙揪出来?
% S9 i# Z& m( c
2 a* S6 Y9 ?" y如果你是一个有权力调查和处理这件事的人,从技术上,可以考虑下面的手段:
0 b7 E+ m9 T5 ? ! {( }1 m* V8 c6 N- J
方法1:# o0 i! c. \0 Q, E! q
0 z( |, {7 V. P' a
伪造的回应数据中并没有处理TTL,也就是说,我们得到的回应数据中TTL是和inject设备位置相关的。; w# p3 R+ O6 C5 g6 ^
以我收到的数据包为例,真实的服务器端回应 TTL是107,伪造的回应TTL是53。
; D% z) C i: a- q那么,从我们这里到被请求的服务器之间经过了21(128-107)个节点,从我们这里到inject设备经过了11(64-53)个节点。
2 f+ v' y6 v7 D4 {: z1 I! G只需要traceroute一下请求的服务器,得到路由回溯,往外数第11个节点就是安插inject设备的地方!! Z7 f# H9 D( F
% e" m% ~. J: F方法2:5 M! x# H. Z, A1 Q. b% L
! @& m4 p- J D
假如坏家伙也看到了这篇文章,修改了TTL,我们仍然有办法。, i% h9 Q- O7 b' w, }
在google上以下面这些关键字搜索:php?curtime,htm? curtime,asp?curtime,可以得到大量访问时会被inject的网址。5 b# J/ T$ L' N. ^0 m) d) ^ T
编写脚本反复访问这些网址,验证从你的ip访问过去是否会被 inject.将确实会被inject的结果搜集起来,
% k, O ]- \5 S1 v6 U在不同的网络接入点上挨个用traceroute工具进行路由回溯。分析回溯的结果。) S$ Z% Z) x3 R; y
8 e8 V% E8 Q4 {- k, M
上面我们已经说明了,坏家伙是在某个或者某些重要节点上安插了inject设备,
( \+ E# P8 l. N7 Q$ O. t那么这个节点必然在被inject的那些网址到我们的IP之间的某个位置上。
* k7 n. i' `. O: {, Q例如有A、B、C、D四个被inject到的网站,从四个地方进行路由回溯的结果如下:
0 V1 D6 H3 C, l/ Z% v2 FMyIP-12-13-14-15-65-[89]-15-57-A+ Q, _! J9 G: W8 ]' W
MyIP-66-67-68-69-85-[89]-45-68-84-52-44-B# H3 a: A$ s Y# R3 G
MyIP-34-34-36-28-83-[89]-45-63-58-64-48-41-87-C
) T4 v9 e, f! h; ~2 U+ c8 bMyIP-22-25-29-32-65-45-[89]-58-D! P/ |0 o7 l u
0 ~( {* O5 q+ q- l2 o+ s
显然,inject设备极大可能就在“89”所在的机房。* M- t) u3 k# ` K+ U2 H# p
w/ s/ v1 Q' t D' O8 D
方法3:8 G. u- i+ y! G' N2 T% Y' ]
# l, M+ q$ Z6 |2 w' h4 `' k
另一方面,可以从存放广告业面的211.147.5.121这个IP入手,whois查询结果如下:
Y+ C/ `7 \# n. {# Pinetnum: 211.147.0.0 - 211.147.7.255. ^8 a- [! t% @7 l7 n/ w8 k6 J# t
netname: DYNEGY-COMMUNICATION1 g6 T( V2 L0 i L3 ?! k: c: E
descr: DYNEGY-COMMUNICATION ~' M) T9 b j2 n* a4 c2 j1 {
descr: CO.LTD
" L8 U; S# E, Q1 c7 ydescr: BEIJING7 r. F+ \) u- M4 `$ U4 ~! J
country: CN
& n6 T9 X) M! o( `) Y5 q( e p9 ^admin-c: PP40-AP& J6 D5 Y1 ~8 l
tech-c: SD76-AP
, s; M& [+ G1 n- K& b) lmnt-by: MAINT-CNNIC-AP
7 W8 _# j( ^+ x% a/ r5 o1 j. uchanged: [email protected] 20011112, T2 P2 U) A8 X8 c+ p
status: ALLOCATED PORTABLE
1 e {1 e. o. r1 O3 h" y5 \source: APNIC& L8 J6 O4 a% J% ]: P7 E' z3 h8 Z" {
person: Pang Patrick" k1 M% j5 J) J$ t6 U8 Q. r
nic-hdl: PP40-AP
( ?* @4 Q' w8 F) Y- \e-mail: [email protected]
$ l) o( V1 ~- V" m# }/ O5 B1 baddress: Fl./8, South Building, Bridge Mansion, No. 53
9 ?1 j+ b/ H, H7 \" g7 xphone: +86-10-63181513
4 c$ ?3 f4 |( m' v2 vfax-no: +86-10-63181597
# x$ M" M0 o9 a' ?4 Hcountry: CN
! ~* y, ?' D! T7 o: ~& ?0 uchanged: [email protected] 20030304' [$ Q; |) B+ ^ y5 k! C) L. i2 a" Q
mnt-by: MAINT-CNNIC-AP, t- f' r0 U$ W5 R: t. `7 c
source: APNIC
: T3 @! T2 [4 A7 K: ?! O* ~person: ShouLan Du
5 Y# |7 V! x7 S5 w: p: Baddress: Fl./8, South Building, Bridge Mansion, No. 53( E9 r& C$ Z F6 ?8 G7 k
country: CN1 D, q) Z, a7 |# d0 F5 V. A
phone: +86-010-83160000
5 ?/ v+ g# i. g2 ^ sfax-no: +86-010-83155528
8 i+ y6 `2 O* u' X! u) se-mail: [email protected]
4 J; s4 M. {( J7 U& e( u6 m% Qnic-hdl: SD76-AP
- S' g) H* Y3 v# |2 u8 A7 rmnt-by: MAINT-CNNIC-AP
( Y& b! |; t! r1 j* `changed: [email protected] 20020403
+ N: W7 v8 |) @+ Fsource: APNIC( {' h( J' A- q% D* c. q$ f5 p3 L' `! c& p
8 D( U1 m0 ]9 I8 H3 m/ D/ {4 |
5、我为什么要写这篇文章?3 _, G0 @4 ~' S! Z" P
" L3 S, e6 m! C% u9 q& Y
新浪为我提供桃色新闻,我顺便看看新浪的广告,这是天经地义的;+ Y8 H# H% [4 a2 f
或者我安装某某网站的广告条,某某网站付给我钱,这也是天经地义的。
- l- c9 _7 X; S9 s) z/ f可是这个 211.147.5.121既不给我提供桃色新闻,又不给钱,却强迫我看广告,这就严重伤害了我脆弱而幼小的心灵。' Q0 Q+ ^4 x e9 K6 V( C( J
事实上,你可以敲诈克林斯·潘,强奸克里奥·佩德拉,咬死王阳明,挖成吉思汗墓,我都不会计较,
, t, ]8 r1 G& R" o. V0 D; W但是现在你既然打搅了我的生活,我就不得不说几句了。( O" ]) d9 s; i/ t
# V W) c) I& b' s0 F, O- x6、我是谁?. _3 ~& W! P; g0 C0 x0 F$ x' o
% A! V2 s' b6 v L/ A1 J2 ]如果你知道MyName,又知道MyCount的话,那么,用下面这段perl可以得到:2f4f587a80c2dbbd870a46481b2b1882。
1 [0 F4 F6 v- ~4 S# w3 G" I#!/usr/bin/perl -w; |6 a% A1 m6 b# _5 \
use Digest::MD5 qw(md5 md5_hex md5_base64);3 ]; {$ O6 m. Z7 v4 E1 f
$name = 'MyName';
; P1 E/ Z) M& d/ I. ^$ h* ^$count = MyCount;
* {9 P: T ?( G4 mfor ($i=0; $i〈$count; $i++)5 U# q4 Q3 n. v! L( K: q
{
/ s5 ^; { X0 [$name = md5_hex($name); D( D1 x6 Q7 C2 `* u
}
2 @( N! x# n" B7 E4 {print $name;0 A, y9 z% n' }4 b: R/ I3 \
! |- d' b8 m6 \- x; C0 O
以下签名,用于以后可能出现的关于此文的交流: P+ b( B7 w) C. }0 H) z+ X! b+ e
1 6631876c2aea042934a5c4aaeabb88e9
- n) L3 T, m: [$ }2 N6 f2 a6a607b3bcff63980164d793ff61d1704 K b+ I! c+ r! j" R
3 6a58e8148eb75ce9c592236ef66a3448
6 w0 j6 o7 R9 [, Y4 ded96d29f7b49d0dd3f9d17187356310) k- J4 t) u6 X1 a
5 cc603145bb5901a0ec8ec815d83eea66 |