|
在剑盟看到的帖子,很值得玩味特此转来,建议新手就不用看了。
- A! s0 l) M9 D$ p: q
* ^7 L5 ?6 f9 g0 F
' @" q# `3 {9 q, D2 `............................................................................................................................................
% g7 B5 Q; `; g' R0 J. |9 l8 w* [3 y. b# {
是谁控制了我们的浏览器?0 T2 Y2 Q/ E/ P6 \. K( F5 C' e. `" |
1、现象是什么?
" B- D" q( _$ q% b% B7 k , G' c$ s# Y6 j4 y" f
大约从今年年初开始,很多人就发现,在浏览一些网站的时候,+ @& Q# \% [* c: @6 a: s5 X
地址栏的url后面会被莫名其妙地加上“?curtime=xxxxxxxxxx”(x为数字),并且弹出广告窗口。
: z* `# @- `+ n7 T9 _# s8 p很多人以为这是网站自己弹出的广告,也就没有在意。# W- M' r- W$ ?' s/ P
+ \7 q# L; Y3 @3 @2 X0 @1 _
我是属于很在意的那些人之一。5 x+ f5 r1 T8 T6 T+ d4 I
3 C* \! m9 \$ Z- A: S" g" ?
2、这是怎么回事?
+ o( | x8 I3 @4 l# S: c' f; q- {! x
Q, v5 {8 S8 f2 H7 q$ ?% U经过测试和分析,我们发现,上述现象与使用何种浏览器无关(我们测试了各种流行的http客户端),
& r5 e2 k3 c! ?% }/ `与使用何种操作系统也无关(linux用户也有相关报告)。3 F1 H0 B5 `% c& U( K8 A9 D
我对出现该现象的IE浏览器进程进行了跟踪调试,没有发现任何异常。可以断定,并不是系统被安装了adware或者spyware。/ A9 B- Q, m6 w" n+ r5 `
# W" b* {6 J) r
那么是不是那些网站自己做的呢?后来发现,访问我们自己管理的网站时也出现了这种情况,排除了这个可能。
9 F* @8 _2 H! l( A, z/ p5 F7 v ( T2 f+ x. i9 q% W) h3 Q4 R
那么剩下唯一的可能就是:有人在某个或某几个关键网络节点上安装了inject设备,
' S) p/ Z4 U5 S) t/ `! F7 t ?劫持了我们的HTTP会话——我实在是不愿相信这个答案,这个无耻、龌龊的答案。! c! G, L1 j3 o9 a; w$ L2 ~
. A# @6 }, r& i! V
伟大的谢洛克·福尔摩斯说过:当其他可能都被排除之后,剩下的,即使再怎么不可思议,也一定是答案。2 D9 E+ @) V$ B/ w& b4 a
k6 p8 j( J; X9 T. y
为了验证这个想法,我选择了一个曾经出现过上述现象的网站附近网段的某个IP。
. V. h# D* g, ~. r- K( o直接访问这个IP的HTTP服务,正常情况下是没有页面的,应该返回 404错误。7 U0 s6 F ?- M3 B2 r# w
我写了一个脚本。不断访问这个IP,同时记录进出的数据包。
) a$ x, v% H: [/ W: }% d- ~( I在访问进行了120次的时候,结束请求,查看数据。120次请求中,118次返回的都是正常的404错误:6 \" U& {* J, l" F) |
HTTP/1.1 404 Object Not Found
0 ^7 v1 \# e: y6 z+ y, o6 X2 yServer: Microsoft-IIS/5.0) R z. r6 b+ s# j7 Z" ^& e
Date: Mon, 19 Jul 2004 12:57:37 GMT+ D4 r- ~, l0 J2 B4 _) }) i3 g
Connection: close) w4 w, g# K7 Z$ Y+ w
Content-Type: text/html
2 B( c6 J, u, @5 Z4 `: ?' pContent-Length: 111
2 M, |, d' [9 U1 F! R〈html〉〈head〉〈title〉Site Not Found〈/title〉〈/head〉
! U* p6 W S" h$ e% h9 Q+ y' B( a4 s〈body〉No web site is configured at this address.〈/body〉〈/html〉
# Q% V5 M. H4 `& \; r- l, i$ h
( e* H9 T, U$ }3 z但是有两次,返回了这个:
% c" b8 w. b2 O8 OHTTP/1.1 200 OK
$ R: v' q; P3 W# l( fContent-type: text/html
0 `8 |; v7 N6 J3 P〈html〉
2 C h9 R( P9 W9 a6 P〈meta http-equiv='Pragma' content='no-cache'〉
* Z6 |) Y) r# N〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉
0 u/ Z2 y% b% {8 }$ P* ?〈script〉
3 U: t) F, B/ @6 n6 K7 Jwindow.open('http://211.147.5.121/DXT06-005.htm', '', 'width=400,height=330');; r9 z. ]. g7 U) N9 h
〈/script〉+ W6 s' j, l& m0 Z9 I2 W- w
〈head〉- Z! s8 G, ]7 g, b% d% t
〈title〉〈/title〉: b3 I4 I4 _' _6 E6 A w }
〈/head〉9 i; I2 y, P" R- M/ X( C) D
〈body〉
# s# L F6 j1 e6 Y〈/body〉
/ Z: C/ A- Z/ w; Y〈/html〉
* y( U4 @* a) o5 E5 {, E# p1 B8 r& S
, R7 s9 _% q1 j9 I更进一步分析数据包,可知劫持流程如下:4 `9 ?5 N1 ^2 }) h7 V0 u4 z9 @
5 g" G, m0 x, k# X# ]
A、在某个骨干路由器的边上,躺着一台旁路的设备,监听所有流过的HTTP会话。9 _' Z' I% H4 \. }. `
这个设备按照某种规律,对于某些HTTP请求进行特殊处理。0 L ]( J3 Q" @% I! Q( g
7 ]( Q3 c$ ^, c N" B, E
B、当一个不幸的HTTP请求流过,这个设备根据该请求的seq和ack,把早已准备好的数据作为回应包,发送给客户端。& \/ b7 p; w' {5 Q
这个过程是非常快的。我们的 HTTP请求发出之后,仅过了0.008秒,就收到了上面的回应。
+ G9 c2 }- d/ Q$ U. p) O# [而任何正常的服务器都不可能在这么短的时间内做出回应。8 b' b4 {1 P5 u& z
6 q0 c- b+ Z3 l( n! {C、因为seq和ack已经被伪造的回应用掉了,所以,真正的服务器端数据过来的时候,会被当作错误的报文而不被接受。
{' P4 `. k: r
* W' h! Q" W; G/ R/ [ eD、浏览器会根据〈meta http-equiv='Refresh' content='0;URL=?curtime=1091231851'〉这一行,
* p5 V$ v9 Q; H重新对你要访问的URL进行请求,这一次,得到了请求的真正页面,并且调用window.open函数打开广告窗口。; S1 l5 I+ W+ @9 ]' i8 y
$ h0 y+ S( Z* l. [% D, F" q5 I& ^
在google中以“php?curtime”、“htm?curtime”、“asp?curtime”为关键字搜索,出现的基本上是国内网站,
1 ^% W) \: z% v' O这表明,问题出在国内。用于inject的设备插在国内的某个或某几个大节点上。& k5 a# \. ^* q) S, B- c/ f
8 W3 E5 [9 u; q4 @
真相大白。我们被愚弄了,全中国的网民都成了某些人的赚钱工具。
) h/ V4 Y& _, ], q: c/ x 3 k8 H/ G$ d+ e/ {1 l! v$ ]; {
3、现在怎么办?( c! l+ M6 y7 t$ O' A
Q5 [/ ~7 S: Y9 q
在坏家伙被捉出来之前,我们要想不受这个玩意的骚扰,可以考虑下面的方法:+ Z/ V% v E1 z) G z% ]& y1 h4 t
( P( I4 x: R, g9 y4 @' o
A、请各单位的网络管理员,在网络的边界设备上,完全封锁211.147.5.121。
: t! h. ^- \2 P. q1 D. I 9 p& y2 R9 j$ n; Z
B、在你自己的个人防火墙上,完全封锁211.147.5.121。
& K- ~5 Q( F4 p9 o7 L* S : t" y) _: ~* O8 ?1 J3 Y9 K) Q4 d
C、如果你的浏览器是FireFox、Opera、GreenBrowser、或者MyIE,可以把“http://211.147.5.121/*”丢到弹出窗口过滤列表中去。: a/ Z- g0 {; d
/ u7 ]" x4 K% L绝不只是广告那么简单,这涉及到我们的选择,我们的自由,这比垃圾邮件更加肮脏和无耻。8 N! s" T v# ^1 J7 c9 y; L4 R$ N
今天是广告,明天就可能在你下载软件的时候给你加个adware或者加个病毒进去,谁知道呢?
" [& e) h+ p8 v! G; K! X我们的HTTP通信完全控制在别人手里。 F, m# q6 v2 T5 A# M; f( k
+ D4 S3 ?0 ?. y) P) s V9 p6 @6 T4、如何把坏家伙揪出来? F+ S/ r$ W7 `1 k$ f2 e
q) q, O* J! d& T- o7 L& A! B
如果你是一个有权力调查和处理这件事的人,从技术上,可以考虑下面的手段:
' ^9 v- P4 k0 E0 s1 m& A5 y 9 f* t, p. m' c+ C( r
方法1:
" [" c( B$ E' o) u$ X 8 ^% W. O9 u! J* w6 Y
伪造的回应数据中并没有处理TTL,也就是说,我们得到的回应数据中TTL是和inject设备位置相关的。
- s1 ~" K" i. E u' |% b7 f& i以我收到的数据包为例,真实的服务器端回应 TTL是107,伪造的回应TTL是53。
* P$ Y; j: U8 ?# b. ?; v% j: [) k那么,从我们这里到被请求的服务器之间经过了21(128-107)个节点,从我们这里到inject设备经过了11(64-53)个节点。+ f' m m; `: R$ S" X- U- k: f! V, d
只需要traceroute一下请求的服务器,得到路由回溯,往外数第11个节点就是安插inject设备的地方!
- Y! y; d: q% z. n* g/ M2 E, m( C, S ) O% `1 w# a$ ~, U) k* D( x3 y
方法2:
0 Z2 F" Z$ a6 j$ M. L3 n' }8 j : z- a3 Y+ Q z' t+ |
假如坏家伙也看到了这篇文章,修改了TTL,我们仍然有办法。
* q l# l q. p& V$ R在google上以下面这些关键字搜索:php?curtime,htm? curtime,asp?curtime,可以得到大量访问时会被inject的网址。
$ Q) p( y4 D3 _# S: k编写脚本反复访问这些网址,验证从你的ip访问过去是否会被 inject.将确实会被inject的结果搜集起来,
W: Q, _& s N在不同的网络接入点上挨个用traceroute工具进行路由回溯。分析回溯的结果。
0 I8 A" F* T2 M7 V $ T8 i: E% Y/ O: }2 d+ D( \
上面我们已经说明了,坏家伙是在某个或者某些重要节点上安插了inject设备,5 A0 s5 e- ], I2 O5 ~1 y, z/ y
那么这个节点必然在被inject的那些网址到我们的IP之间的某个位置上。
i+ d+ w+ n" ?- G" w1 B) [3 y例如有A、B、C、D四个被inject到的网站,从四个地方进行路由回溯的结果如下:
* D' U6 r- ]: M( g! }) R# d1 T. M& ]MyIP-12-13-14-15-65-[89]-15-57-A, Y, N% F: Z& |0 V1 W2 S
MyIP-66-67-68-69-85-[89]-45-68-84-52-44-B
, t5 H% e( @2 _: i" | k" xMyIP-34-34-36-28-83-[89]-45-63-58-64-48-41-87-C
' c- O1 m% T7 v+ \MyIP-22-25-29-32-65-45-[89]-58-D
/ C% s4 A) L3 d5 V2 W
* ]: h2 }% l- p7 J# f显然,inject设备极大可能就在“89”所在的机房。! k( \" M0 i7 u5 f
4 J; l9 G' Y V; T! J, F5 L
方法3:
* g" ]- k3 v* X* g q3 r+ ]$ N7 H0 d& @
另一方面,可以从存放广告业面的211.147.5.121这个IP入手,whois查询结果如下:
! L' u* w& h5 @inetnum: 211.147.0.0 - 211.147.7.255
( `5 U' _& W7 A9 jnetname: DYNEGY-COMMUNICATION
! i- Y5 L2 ~3 `descr: DYNEGY-COMMUNICATION
- ~0 C6 `! A! m% {$ r. _8 v6 Bdescr: CO.LTD
! k8 p5 ^: N' {+ M7 ~descr: BEIJING9 N. w' V, w& i! }
country: CN
7 ?& g' f+ T1 A2 wadmin-c: PP40-AP
+ B+ f# H* k$ e$ @tech-c: SD76-AP
2 Y; T. Q2 E; Imnt-by: MAINT-CNNIC-AP
" z; _2 q7 N& f8 M+ k( g1 k- hchanged: [email protected] 20011112( A- a; E5 A7 X' U+ m1 g/ G
status: ALLOCATED PORTABLE. J% \3 z; z9 q. e' l# n7 j
source: APNIC7 A6 p# C2 P& F/ t% o* y% ?5 b, U
person: Pang Patrick
$ c* T( e1 T( ^" [nic-hdl: PP40-AP
' |! O7 t- ]7 Y+ x `5 i% O+ ve-mail: [email protected]
; J Z' M' T8 n0 j0 o1 aaddress: Fl./8, South Building, Bridge Mansion, No. 53
w5 ^/ m1 \. i# Nphone: +86-10-63181513
* B8 n* Q4 r; _; V! J3 m, ifax-no: +86-10-631815976 N$ I. D7 s) @: o
country: CN: {5 x O& g" h
changed: [email protected] 20030304
0 c+ Z. l' K9 G- q' q. e) @8 wmnt-by: MAINT-CNNIC-AP/ v% M/ O- S8 v% y) T
source: APNIC
8 P) F2 Z" v, U Z7 X! V- Kperson: ShouLan Du
3 v2 d( ?! c |+ _& y gaddress: Fl./8, South Building, Bridge Mansion, No. 53
" Y3 h8 S2 S- m3 I# g: z% Icountry: CN
8 R, J5 S8 Z" Uphone: +86-010-83160000
) ^: a& g% w1 e( m, _' Tfax-no: +86-010-83155528
& p$ Q* U3 _) L1 |4 k2 A9 P0 N* me-mail: [email protected]
9 Q) \9 M0 ~. X( Vnic-hdl: SD76-AP( z& _, ~5 j1 G, N
mnt-by: MAINT-CNNIC-AP
( W& ~6 T* ]& h. ]9 Qchanged: [email protected] 20020403
2 o. j- s* f* J; K4 q) L* Fsource: APNIC# c" G4 e; ?7 U( _3 t3 p8 l( A1 x
$ H9 d% _1 Q g7 T) x$ i3 }5、我为什么要写这篇文章?3 Q$ L- _) b @
! z+ ~/ [3 C/ C8 _8 a
新浪为我提供桃色新闻,我顺便看看新浪的广告,这是天经地义的;1 w$ o" y* i( ]% m
或者我安装某某网站的广告条,某某网站付给我钱,这也是天经地义的。2 M% s _, C9 ~4 l3 {4 t
可是这个 211.147.5.121既不给我提供桃色新闻,又不给钱,却强迫我看广告,这就严重伤害了我脆弱而幼小的心灵。
) @ J8 T2 F, P; F. K8 v事实上,你可以敲诈克林斯·潘,强奸克里奥·佩德拉,咬死王阳明,挖成吉思汗墓,我都不会计较,
+ d$ h" _7 a( \& E5 Y但是现在你既然打搅了我的生活,我就不得不说几句了。
, G6 i! J4 g* k% o
4 S. u% Q- V+ _& a1 l- S6、我是谁?& ]3 n9 [$ O% s
4 ^# n6 H- W; ]6 c5 ?0 Q8 _
如果你知道MyName,又知道MyCount的话,那么,用下面这段perl可以得到:2f4f587a80c2dbbd870a46481b2b1882。/ @# h6 c- k4 j2 f2 E& ^% S+ ~( Q
#!/usr/bin/perl -w
& j; w9 V7 z [use Digest::MD5 qw(md5 md5_hex md5_base64);, ~) V+ ^) ~. }9 J5 O( K9 t
$name = 'MyName';$ n, ^4 m) I5 Q0 m
$count = MyCount;- Z) I& f& S _7 v% v
for ($i=0; $i〈$count; $i++)% ^+ F0 G1 D/ ~/ |/ G* S
{/ O( \3 S( y1 Z6 h! {
$name = md5_hex($name);% E, N1 ?7 j& G2 F9 Q
}; `) b9 D2 v/ S! [7 V+ \
print $name;
7 I% p# x/ A: g# k * p+ t4 y D- @9 V+ x
以下签名,用于以后可能出现的关于此文的交流:% Z& Y7 s0 G2 x9 Z$ V4 I, Z
1 6631876c2aea042934a5c4aaeabb88e9
% y; m i* N9 @& C. c2 a6a607b3bcff63980164d793ff61d1709 l* E; d$ l7 f0 Q: m
3 6a58e8148eb75ce9c592236ef66a3448
2 U" q5 ~* g# a* @- s0 W( c- N5 T4 ded96d29f7b49d0dd3f9d17187356310
4 k" F" ~! D, h( o5 cc603145bb5901a0ec8ec815d83eea66 |