在剑盟看到的帖子,很值得玩味特此转来,建议新手就不用看了。0 G b6 E, ^( t
6 e' F% M$ ~! P' J
9 v' _& x0 H& U6 _* |' A............................................................................................................................................
, V/ Q* G# l$ V" P( Q5 }' g' ]1 ?5 _" c; R0 j* v0 h: `, |3 e2 ^
是谁控制了我们的浏览器?0 @6 `5 J) [5 n% H' |, Z
1、现象是什么?
+ h8 Y! r' |+ f4 M) d% [$ w
6 X4 D& K2 B( l5 J8 z大约从今年年初开始,很多人就发现,在浏览一些网站的时候,
6 u, d4 Y, t( L1 C1 d地址栏的url后面会被莫名其妙地加上“?curtime=xxxxxxxxxx”(x为数字),并且弹出广告窗口。
- o( ?+ j; P& T3 V很多人以为这是网站自己弹出的广告,也就没有在意。
& ]8 Q2 Z1 G* _' P
7 \! Q+ ^" @( f9 o7 D H我是属于很在意的那些人之一。
3 D8 y f* H3 d& M9 r $ T: K% u2 O4 |( j& t z
2、这是怎么回事?2 @: P% e' ?3 q: r
" k5 l. p) N6 V, q7 b/ y. Q3 W
经过测试和分析,我们发现,上述现象与使用何种浏览器无关(我们测试了各种流行的http客户端),
" Q6 J b5 j/ Z+ c与使用何种操作系统也无关(linux用户也有相关报告)。4 a% R" D; y0 g6 F }
我对出现该现象的IE浏览器进程进行了跟踪调试,没有发现任何异常。可以断定,并不是系统被安装了adware或者spyware。6 `4 i1 S1 Z5 F
' J- z. _& z; x
那么是不是那些网站自己做的呢?后来发现,访问我们自己管理的网站时也出现了这种情况,排除了这个可能。
3 N+ q ~5 a9 y1 K 5 N4 {6 h' C+ K4 [; x) r8 j0 v
那么剩下唯一的可能就是:有人在某个或某几个关键网络节点上安装了inject设备,5 N# B3 c; C, u8 l$ A6 v
劫持了我们的HTTP会话——我实在是不愿相信这个答案,这个无耻、龌龊的答案。
1 ]1 f6 W" ?) I $ n& @0 S" X+ |# w
伟大的谢洛克·福尔摩斯说过:当其他可能都被排除之后,剩下的,即使再怎么不可思议,也一定是答案。
& L; c- Q, G) ]' W! b% T0 g1 T( l ( `6 d" t8 W& r0 `: T/ J4 O
为了验证这个想法,我选择了一个曾经出现过上述现象的网站附近网段的某个IP。
3 N/ V9 x0 ~6 l直接访问这个IP的HTTP服务,正常情况下是没有页面的,应该返回 404错误。: V+ G6 N8 d' X
我写了一个脚本。不断访问这个IP,同时记录进出的数据包。
/ h+ Y2 L2 z4 B% V2 z( G9 J在访问进行了120次的时候,结束请求,查看数据。120次请求中,118次返回的都是正常的404错误:
' h. K. w$ M( _% bHTTP/1.1 404 Object Not Found6 }6 |: ?8 {) H
Server: Microsoft-IIS/5.00 U# Y" P5 m) |+ S6 i* P; S
Date: Mon, 19 Jul 2004 12:57:37 GMT
1 U/ V4 O- j; d) p ^; {4 Z4 uConnection: close
4 G, x% q# C# c- m MContent-Type: text/html& p6 K# r0 d) F
Content-Length: 111
2 N0 N; I) R' r〈html〉〈head〉〈title〉Site Not Found〈/title〉〈/head〉' H$ j9 |4 v0 N* }* R6 o: \1 X
〈body〉No web site is configured at this address.〈/body〉〈/html〉/ V; W% @1 M1 y
6 Z8 p) M- ^3 C2 F$ R6 N8 I/ i1 ^但是有两次,返回了这个:0 E k. U# N! g
HTTP/1.1 200 OK0 ~% K$ X5 [* ?- \
Content-type: text/html+ p$ d, ~$ `& r( i1 S# }$ s
〈html〉, ?7 c7 ]9 G5 c! i
〈meta http-equiv='Pragma' content='no-cache'〉
! M) }8 F4 i/ Z0 g2 m, w/ ~* H〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉
$ `$ V w" d' l6 w& _〈script〉
( b; d+ C. n* D% i: S7 `6 ewindow.open('http://211.147.5.121/DXT06-005.htm', '', 'width=400,height=330');" S; y$ d) b: y5 N: n7 m7 j" A
〈/script〉. Q/ R3 }# b( ]0 i7 j' d6 V* A
〈head〉, e' J* m9 d* y, y# e3 B
〈title〉〈/title〉& b- v( w, F% K0 P" Y
〈/head〉 z- y! Z9 z" Z7 u% x
〈body〉
1 l) s5 V9 U4 O, x) |〈/body〉+ f4 O( C. y9 M6 M& h
〈/html〉- x! d3 R8 W2 K/ f% ]
# a, ]& n8 w( s2 S" `- J: s
更进一步分析数据包,可知劫持流程如下:
) [8 I6 q9 k0 W$ e6 L4 p% S & o8 |/ N! J7 E5 {* Q' |) r' Y
A、在某个骨干路由器的边上,躺着一台旁路的设备,监听所有流过的HTTP会话。
. r9 s% E, {2 K! N" z q: t- [! b这个设备按照某种规律,对于某些HTTP请求进行特殊处理。2 \# q3 y0 S2 {: `& @ R& H/ O% k
/ `% |- {8 {! O; J" e$ B" O# ^
B、当一个不幸的HTTP请求流过,这个设备根据该请求的seq和ack,把早已准备好的数据作为回应包,发送给客户端。
) E+ g8 u, d$ `9 q! L* h这个过程是非常快的。我们的 HTTP请求发出之后,仅过了0.008秒,就收到了上面的回应。
) |& M3 v) ^' I1 C而任何正常的服务器都不可能在这么短的时间内做出回应。
3 [' Y2 Z' m, p$ b4 L, R. p ) P$ L& _# i' V
C、因为seq和ack已经被伪造的回应用掉了,所以,真正的服务器端数据过来的时候,会被当作错误的报文而不被接受。' o* w1 m n m! D& g1 C8 I7 ^
" L8 D. T- ]& H) D
D、浏览器会根据〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉这一行,
- {7 q2 J r5 d$ ^/ i6 n, t重新对你要访问的URL进行请求,这一次,得到了请求的真正页面,并且调用window.open函数打开广告窗口。
$ q3 ]5 G: w& v& v# i0 S, d2 Z- L
2 R; t8 w6 _9 d V在google中以“php?curtime”、“htm?curtime”、“asp?curtime”为关键字搜索,出现的基本上是国内网站,
6 T. U; ~' j6 u) f, r2 D2 {+ {这表明,问题出在国内。用于inject的设备插在国内的某个或某几个大节点上。# z d' N; z" Q" |, J
( o9 X, z7 ]: R7 F真相大白。我们被愚弄了,全中国的网民都成了某些人的赚钱工具。
) {! v1 F9 s9 |! d, k ; |9 Z: a% n9 V: `
3、现在怎么办?
. S& W5 y- J+ f* w1 t' E/ b 6 W" G* |2 \" ]8 e# x0 r
在坏家伙被捉出来之前,我们要想不受这个玩意的骚扰,可以考虑下面的方法:
1 P- ~$ J' ?: n) z0 E) W- q0 U
: z8 V* C3 d9 o" ?. M+ c5 ~A、请各单位的网络管理员,在网络的边界设备上,完全封锁211.147.5.121。
4 K5 h, M2 y/ _0 p! \% G) z& [
: X- N: w( U2 _( d0 y- Q5 pB、在你自己的个人防火墙上,完全封锁211.147.5.121。2 I5 m" E: Y' l$ G. ]
8 U# E3 `/ n1 g- v6 a- t1 UC、如果你的浏览器是FireFox、Opera、GreenBrowser、或者MyIE,可以把“http://211.147.5.121/*”丢到弹出窗口过滤列表中去。
5 {% \+ |+ _- ~: C r i$ @ - o9 w/ ]1 T! C) H' u
绝不只是广告那么简单,这涉及到我们的选择,我们的自由,这比垃圾邮件更加肮脏和无耻。: \7 z) }7 r4 t/ P' X8 I5 ]" J
今天是广告,明天就可能在你下载软件的时候给你加个adware或者加个病毒进去,谁知道呢?
3 s& `# Z- S! b+ r我们的HTTP通信完全控制在别人手里。2 j0 \0 E% Y( Y4 W" ?
1 E& C; O. f" w, I2 \
4、如何把坏家伙揪出来?
7 K* m5 q% G0 l4 h* h
5 K$ @$ Z9 \0 d7 h% D8 O9 m6 j* }- d如果你是一个有权力调查和处理这件事的人,从技术上,可以考虑下面的手段:& z+ X4 A. t5 e k# ^
' p% ? w7 ?4 B0 N/ x. s
方法1:) W4 j( L: ?. S; H3 k
: y+ o0 V5 w+ x; g" _
伪造的回应数据中并没有处理TTL,也就是说,我们得到的回应数据中TTL是和inject设备位置相关的。
2 S. f4 N3 b: `" N0 D0 a以我收到的数据包为例,真实的服务器端回应 TTL是107,伪造的回应TTL是53。5 b( k$ b r! G6 b5 M4 c
那么,从我们这里到被请求的服务器之间经过了21(128-107)个节点,从我们这里到inject设备经过了11(64-53)个节点。
0 ^) |4 w5 K F$ b/ R只需要traceroute一下请求的服务器,得到路由回溯,往外数第11个节点就是安插inject设备的地方!, O3 E8 @. W! a) `
7 c/ v1 @+ Q* ^4 z2 J0 F
方法2:3 D N6 V J- A. H
( z1 s/ A% u7 i. ^9 v2 q( L. v0 w! @& V假如坏家伙也看到了这篇文章,修改了TTL,我们仍然有办法。: y, t) R7 ?$ B% t, m3 x
在google上以下面这些关键字搜索:php?curtime,htm? curtime,asp?curtime,可以得到大量访问时会被inject的网址。- k, l7 W3 _, c
编写脚本反复访问这些网址,验证从你的ip访问过去是否会被 inject.将确实会被inject的结果搜集起来,7 ^0 d$ r9 p3 k/ B, L
在不同的网络接入点上挨个用traceroute工具进行路由回溯。分析回溯的结果。6 Y: ~7 v- A* ^6 M
# r s6 Y7 Q/ P9 t. ?
上面我们已经说明了,坏家伙是在某个或者某些重要节点上安插了inject设备,8 S3 j9 o7 x- l2 ?' a/ N
那么这个节点必然在被inject的那些网址到我们的IP之间的某个位置上。
, I0 j3 f. c3 Z7 P1 F4 ]例如有A、B、C、D四个被inject到的网站,从四个地方进行路由回溯的结果如下:
# q i+ @5 R% I2 M( u( L: RMyIP-12-13-14-15-65-[89]-15-57-A
0 t8 C3 z) m& F* D4 J7 fMyIP-66-67-68-69-85-[89]-45-68-84-52-44-B( M& u5 c& g+ n
MyIP-34-34-36-28-83-[89]-45-63-58-64-48-41-87-C
; m. F# r* D* P1 u7 a9 X5 z3 Y, H4 }MyIP-22-25-29-32-65-45-[89]-58-D8 s4 r( t8 J0 h3 @* u- e' N
1 s4 S8 d3 s( Y
显然,inject设备极大可能就在“89”所在的机房。9 ?! h! x6 [1 Q6 ] o& o% {
3 T% l* L" V- `2 c0 A+ }" F方法3:
/ ?; e1 P9 f0 t$ z5 O) U) L
# s. S- }8 s. U0 y& z' B- }2 o7 Y另一方面,可以从存放广告业面的211.147.5.121这个IP入手,whois查询结果如下:9 F* J t9 J i) d$ I/ \
inetnum: 211.147.0.0 - 211.147.7.255
& F% Z- X% _+ B9 D) ]7 d5 inetname: DYNEGY-COMMUNICATION
# _( _9 A0 Z; Kdescr: DYNEGY-COMMUNICATION. D* @3 E+ G$ z6 S
descr: CO.LTD' M% }. K' {& I' f
descr: BEIJING5 E- a/ D2 N# }7 l% d
country: CN
, K* Q; Z2 k6 |% E& i, Dadmin-c: PP40-AP( N1 r2 a; @# b& L R
tech-c: SD76-AP
! Y$ B$ U6 B7 s; E; j# K6 Pmnt-by: MAINT-CNNIC-AP4 F6 l5 B& ]- X- \) ?" ^* c
changed: [email protected] 20011112" D1 c7 J; E }. `1 R' m( J& r
status: ALLOCATED PORTABLE3 t6 i% [& Q* g# k0 I. k
source: APNIC
2 _0 g) B$ J. }* R) Y* bperson: Pang Patrick
0 Y8 X" W: F4 A" p: g! K, C" Cnic-hdl: PP40-AP7 U5 A0 {! x K* [* V8 }3 |* H
e-mail: [email protected]/ u$ \' v) [ K& P$ K9 w* x5 h
address: Fl./8, South Building, Bridge Mansion, No. 53
1 P3 C1 J2 ?6 ^/ F |7 wphone: +86-10-63181513
# U9 Z; N/ \( {' D. ^' q5 M0 y) ofax-no: +86-10-631815973 b6 Q) P2 R0 ]! h
country: CN
1 v8 I) Z2 J9 C3 {changed: [email protected] 20030304
% Y. ~$ N0 ?! Q5 n6 Pmnt-by: MAINT-CNNIC-AP
1 Y" W. F; R( n# [0 `) Y) o2 isource: APNIC7 \: W3 |4 c. [' k5 P# z0 c- ]. F
person: ShouLan Du. k0 R/ M% S0 S2 n
address: Fl./8, South Building, Bridge Mansion, No. 53: e5 z' G. G1 C. \6 w
country: CN
9 F3 w9 `% M% e pphone: +86-010-83160000
6 s6 K" ~. n+ g2 x# hfax-no: +86-010-83155528* V7 Q' L M) }7 e: m6 F) [
e-mail: [email protected]- i& ?. N0 J# O3 l8 m. v0 Z' ^
nic-hdl: SD76-AP D) M) i6 o: ~+ a
mnt-by: MAINT-CNNIC-AP
/ ?! q; s4 j; W1 V) K9 Gchanged: [email protected] 20020403
; L3 w/ I- _% D! V4 ~source: APNIC- ~! s# ^; Q1 ]. p2 @" L5 s1 J
8 x6 P" l3 I1 |8 |9 s# G3 F j5、我为什么要写这篇文章?. e4 |5 @. g' Q5 }: l6 R
. ]1 |% s) V. d- e
新浪为我提供桃色新闻,我顺便看看新浪的广告,这是天经地义的;) o h1 w; F- G( m3 f" r
或者我安装某某网站的广告条,某某网站付给我钱,这也是天经地义的。8 m; [ t0 T' {# q
可是这个 211.147.5.121既不给我提供桃色新闻,又不给钱,却强迫我看广告,这就严重伤害了我脆弱而幼小的心灵。
' \( d$ K. ]& [' _8 a3 }事实上,你可以敲诈克林斯·潘,强奸克里奥·佩德拉,咬死王阳明,挖成吉思汗墓,我都不会计较,
- X4 Q3 s1 E; ]# q8 P5 e, M但是现在你既然打搅了我的生活,我就不得不说几句了。
* n: Z% X6 L0 K$ ^& c5 W, c) M
, F9 G2 I( G4 g2 u C6、我是谁?
/ Z F3 Z" `, F9 h" b0 M# S
8 L3 |# i* G6 u" Y @如果你知道MyName,又知道MyCount的话,那么,用下面这段perl可以得到:2f4f587a80c2dbbd870a46481b2b1882。
1 P2 ^0 q; Z) y7 ^ s3 z#!/usr/bin/perl -w6 a4 g$ `' @/ L2 q# }6 c" T1 D" s
use Digest::MD5 qw(md5 md5_hex md5_base64);
. b0 K6 k* @* C# U" X: E$name = 'MyName';
" r X( ]9 S, C1 @$count = MyCount;2 t6 k# k# M3 E3 q/ {
for ($i=0; $i〈$count; $i++)$ _, f, b, K. c, p- [
{
" I4 }' o+ m* w- Q$name = md5_hex($name);
7 Q( |5 K& L3 }8 j/ c}- U* D9 }% t6 A; W
print $name;
$ p' c/ I9 c' A$ o % N5 Q/ A$ c5 c6 g5 n
以下签名,用于以后可能出现的关于此文的交流:
, U! z/ ^* ]$ M2 B2 { J+ B( a5 B1 6631876c2aea042934a5c4aaeabb88e9) M5 D7 H4 ~$ ?
2 a6a607b3bcff63980164d793ff61d170! w. P/ e K4 U/ s; _* j C
3 6a58e8148eb75ce9c592236ef66a34482 e; z% o( s: z; `0 R
4 ded96d29f7b49d0dd3f9d171873563109 @) `8 j2 F- Z" P9 Y
5 cc603145bb5901a0ec8ec815d83eea66 |