在做些分析時,發現有些好玩的,這篇文章也想跟大家說這類網站真多,實在無法窮舉;用 google 搜尋一些詐騙、釣魚網站的網域,結果"Sponsored Link"都指到相同網站哩,看看下面三張圖:
所以用 google 查詢下列關鍵字: totalsecure2009.com smart-antivirus-2009.com smart-antivirus-2009-buy.com 上面三個網站都是偽裝防毒軟體的詐騙網站,用這些網域在 google 上查詢,都會查到"www.free-web-browsers.com"的贊助連結。
簡單來說,跨站腳本攻擊(XSS)的基本精神就是駭客在 HTML 文件中安插網頁腳本語言(譬如 JavaScript 或 VBScript),讓受駭方的瀏覽器在瀏覽網頁時進而去執行。這延伸兩個討論議題: 1. 為何駭客能夠在 HTML 文件中安插這些腳本? 在 Web 2.0 的時代,大部分的網頁或多或少都需要產生動態內容,都需要與使用者互動,一旦使用者所提供的資料(譬如惡意腳本字串)有機會成為動態輸出的 HTML 內容的一部份時,這樣惡意腳本就被成功地安插進原本合法無惡意的 HTML 文件了。這也是為何許多客戶最後選擇從源碼檢測著手,揪出這些進入點與輸出點,治本地解決跨站腳本攻擊(XSS)。
進去後先吃早餐,排隊排到都餓了。我坐下來,發現旁邊是一位很年輕的美國人,看來很想睡覺,眼睛幾乎睜不開了,但是手卻很忙,仔細一看,他正在開鎖,工具就擺在桌上。邊吃邊聊了起來,原來他就是 Jon King,正在開美國能做出來最安全的鎖:Medeco 的最頂級六針型鎖頭。Medeco 目前有超過四百名員工,在美國高階鎖市場市佔率達七成以上,凡舉各銀行,機密單位,軍方等,一律都採用Medeco 的鎖,所以一般美國鎖匠,也把 Medeco 看成是「終極神鎖」。
Jon 說他兩天沒睡了,眼睛睜不開,但是還是很熱心的一直跟我說,他是如何破解這顆鎖的。雖然我不懂鎖,但是聽起來真是有趣,找漏洞需要有一種特殊的「心理狀態」,而這種狀態,看來似乎實體安全跟資訊安全所需要的其實差不多。另外我更有興趣的是,他從驗證弱點到與廠商互動到公開攻擊方法的整個過程,也就是所謂的負責的弱點揭露(responsible vulnerability disclosure)的程序。這個議題雖然目前在資安圈,尤其是各大駭客年會上,正是個火熱的話題,但是在鎖匠的社群裡,這個議題已經有很長的歷史了(鎖跟電腦的發明差了多久?),可能也因為如此,似乎處理的方式也比較成熟。
弱點揭露(vulnerability disclosure)中,雙方永遠是不對等的(就像最近 Google 與 RSnake 事件)。Medeco 是四百人的公司,背後還有美國政府。Jon 是一個 22 歲的小伙子。如果 Jon 與 Medeco 簽了保密合約(NDA),那麼 Jon 沒有 Medeco 允許,不能公開他找到的弱點。可是這種弱點可能讓一個製鎖公司瞬間瀕臨倒閉(記得 2004 年 Kryptonite 事件嗎?),Medeco 會讓 Jon 出去講嗎?可是如果不講,Medeco 可能根本不改善弱點,或者出新版後也不承認舊版有弱點(鎖不能 binary diff patch 吧?)如果 Jon 不簽 NDA 而直接完整揭露(full discloser),Medeco 可以稱此為不負責任揭露,發動輿論攻擊或甚至提告 Jon。故事會如何發展呢?
今年四月,Peter 帶著各種工具、零件與攝影機,來到了 Jon 住的公寓。五月,Medeco 已經設計出新一代產品:ARX 並可以生產,對於已經賣出的產品也有了修改套件。七月,Jon 首次於 The Last Hope 資安會議上展現此弱點與攻擊技巧:
七月底,Jon 寫的關於 Medeco 的完全揭露(full disclosure)公布於 NDE 雜誌第四期,裡頭註明了,此篇應 NDE 要求,延遲兩個月公布,目前兩個月時間已過,Medeco 也出了新產品 ARX,Jon 的攻擊對於新產品已失效,對於已經在市面上的眾多舊產品,Medeco 已經出了修補的套件。今天在 DEFCON,Schuyler 與 Jon 首次同台,共同講述了整個從發現弱點、設計攻擊工具、通知廠商到完整揭露的整個過程。整個演講有一半在探討負責的弱點揭露(responsible vulnerability disclosure)程序,內容大致與 NDE 第四期的第一篇文章相同,有興趣的朋友可以讀一讀。
演講中最精彩的,莫過於 Jon 當場拿他設計的工具示範開鎖。第一次很快地,他手一揚,結果又收回來,因為原本以為開了,但是手一抖就沒開成。這時 Jon 說:「各位,我希望我在 DEFCON 能開成,但是我兩天沒睡了,不能保證...」這時很多觀眾幫他出聲打氣:「You can do it Jon!」。一瞬間,從攝影機看到鎖頭動了,轉到開的位置,Jon 立刻把鎖頭高舉,大家興奮得一直鼓掌...
Chema 在台上 demo 時一下子秀出他吸大麻的照片,一下拿出照相機拍台下的聽眾,一下子不斷用西班牙話數著:「一、二、三、四、五,注入成功!」活像個超級黑客。他目前在馬德里的 Rey Juan Carlos University 大學攻讀博士學位,由 Dr. Antonio Guzman 與 Dr. Marta Beltran 共同指導。這個演講其實就是根據他寫的博士論文。
對於他整裡的時間差方法,因為時間有限,我簡單用他的第一個例子(MS SQL Server heavy query)敘述如下:
SELECT count(*) FROM sys.sysusers AS sys1, sys.sysusers AS sys2, sys.sysusers AS sys3, sys.sysusers AS sys4, sys.sysusers AS sys5, sys.sysusers AS sys6, sys.sysusers AS sys7, sys.sysusers AS sys8)>0 and 300>(select top 1 ascii(subsring(ame,1,1)) from sys.sysusers)
其實我們可以把這個指令簡化來看成兩個 evaluation 被 and 起來:
A and B
其中
A=SELECT count(*) FROM sys.sysusers AS sys1, sys.sysusers AS sys2, sys.sysusers AS sys3, sys.sysusers AS sys4, sys.sysusers AS sys5, sys.sysusers AS sys6, sys.sysusers AS sys7, sys.sysusers AS sys8)>0
B=300>(select top 1 ascii(subsring(ame,1,1)) from sys.sysusers)
這樣看就很清楚,A 是一個 heavy query,沒什麼特別,就是一個會讓 SQL server 做很久的 SQL 指令。
B 則是我們實際上要判斷的:sys.sysusers 的第一個字元 ASCII 碼大於或小於等於 300。
然後,這整個指令會先測 B,如果 B 成立才會測 A,而測 A 需要很久(幾秒)的時間。所以也就是說,如果 B 成立,伺服器的回應會慢,因為還要 evaluate A;否的話,則很快可以得到回應。其實講到這邊就講完了...但是,為何 B 會先被 evaluate,然後再 A,造成一個類似 if...then 的狀況?因為這種方式在 SQL injection 技巧中用的蠻多的,我們就來探討一下 :)
至於 MS SQL "AND" 的 short-circuiting,當真是個謎,這裡試出來是左到右,這裡卻是右到左。我沒有太多時間研究,但是我的猜測是,第一,MS SQL 不是 procedural language,所以不會硬性規定順序。第二,MS SQL Server 會根據如何做可以達到最佳效能,來決定所有被 AND 起來的 condition,誰先執行而誰後執行。基本原則是,快的先執行,這樣做 short circuit 才有意義。這是我個人看法,這裡有沒有熟 MS SQL 的看官?
無論如何,Chema 提的例子當中:A and B,其中:
A=SELECT count(*) FROM sys.sysusers AS sys1, sys.sysusers AS sys2, sys.sysusers AS sys3, sys.sysusers AS sys4, sys.sysusers AS sys5, sys.sysusers AS sys6, sys.sysusers AS sys7, sys.sysusers AS sys8)>0
B=300>(select top 1 ascii(subsring(ame,1,1)) from sys.sysusers)
因為執行順序為先 B 後 A(為什麼?我覺得因為 MS SQL Server 判斷 B 比較快 evaluate),所以如果 B 是 true,那麼就會執行 A。也就是說,如果 sysusers 的第一個字母的 ASCII 值大於 300 的話,伺服器的回應會慢,因為還要 evaluate A;否的話,則很快可以得到回應。
好玩吧!事實上,我覺得即使把 A / B 對調,變成:B and A,結果還是 B 會先被 evaluate。但是沒有試過就是了... :)
function xor_str(plain_str, xor_key) {var xored_str=""; for (var i=0; i < plain_str.length; ++i) xored_str += String.fromCharCode (xor_key ^ plain_str.charCodeAt(i)); return xored_str; }
function asd(a,b) {}; function qwe(c,i) {}; var plain_str="\x8d\xa0\xa7\xa0\xa7\xa0\xa7\xdb\xcc\xdf\xcc\xd4\x85\x84\x96\xa0\xa7\xdb\xcc\xdf\x8d\xc0\xc8\xc0\xf2\xcb\xc1\xcc\xca\x8d\x90\x8d\x9d\x96
...
\x84\x96\xa0\xa7"; var xored_str=xor_str(plain_str, 173); eval(xored_str);
3. XOR(字元編碼) 範例:
str = "ru'su)(:^L^Kgtobuhno!ru'su)(!z^L^Kw's!fgg!...
ubi)d(z||"; str2=""; for (i=0;i
接下來要找一些人把這個假的 Marcus 加入好友,這樣這個帳號看起來才像。網路上很多人對於建立線上社交網路很積極,只要你要求把他們加入好友,他們都會答應。Nat 跟 Shawn 用了以下這個 Google hacking 查詢:
"invites accepted" OR "open networker" OR "accepts all invites" OR lion OR toplinked.com OR mylink500 +site:linkedin.com +inurl:/in/ -inurl:updates
從完成假帳號的建立,到使用 Google hacking,到送出約 50 個加入好友 request,只花的一小時。十二個小時後,這個假帳號已經建立了 42 個關連,使得帳號看起來更真實了。不到半天的時間,這個帳號就已經加入了一些資安圈的重要社交群組。接下來就等待看有沒有人送要求過來,希望把假 Marcus 加入好友了。
結果是,很多人送訊息過來,表達在線上遇到 Marcus 實在太好了一些資安界重量級人物也要求把假 Marcus 加入好友,更多人送訊息來跟假 Marcus 討論最新的資安議題...沒有一個人懷疑這個帳號的真實性!而這一切,都是在二十四小時內完成的!
6. 黑白帽相見歡(Meet the Feds)(大會介紹)
聽完了 Wendel 的演講,接著就是每年 Black Hat 以及 DEFCON 各有一場,很好玩的黑白帽相見歡(Meet the Feds)啦!MTF 每年都是大陣仗,今年也不例外,美國與加拿大兩個政府總共出動了 11 個相關單位代表:
為什麼 NASA 也來呢?NASA 其實在駭客史上是常出現的,因為 NASA 從早期大家就知道,很多好機器,名聲有大,所以大家喜歡攻...還有重點是,其實不難攻,只是會被抓。另外由於各界都對 NASA 的研究很有興趣,所以 NASA 很早就有 website,並有很大的流量。我記得 1995 年世紀大彗星Hale-Bopp被發現時,大家都是到 NASA 的這個網頁來看資料與照片。到 1997 年時,這個網頁已經有一天超過一百萬次的流量了。如果當初有網頁掛馬,想一想一個一天有一百萬次流量,但是又不太難攻的網頁,對駭客的吸引力會有多大。所以在與駭客作戰方面,NASA 一直算「有經驗」的單位 :)
IRS 會來也是差不多原因,但是比 NASA 還多一個強處。美國抓到人卻無法有效舉證判罪時,都是出動 IRS。個人意見,在美國得罪 IRS 比得罪 FBI 還慘。
這場結束後今天也就大功告成啦,等一下還有聚會,真是累死人。利用空檔去繞了一些展示區,發現美國國家標準局(NIST)有來展示量子加密(quantum cryptography)。我資格考考了兩科 quantum,唸了很多 Alice 跟 Bob,但是從沒看過 live 系統,今天真是大開眼界啊!NIST 的研究員正在吃飯,卻放下食物好心的整個跟我解釋了一遍,真是感動,謝謝各位,系統做得真的太帥了!
8. Thomas Wilhelm:移動駭客空間(Mobile Hacker Spaces) 最後繞道了大門外,參觀了一下今年第一次從科羅拉多開過來展是的移動駭客空間(Mobile Hacker Spaces)。移動駭客空間在這個社群中很紅,因為可以開車到處偷別人的無線訊號來做... 研究... 咳...咳...
所以我們拿「Google Chrome」來實戰釣魚網站,這釣魚網站很常見的詐騙伎倆,大家不可不防的,實戰結果卻有點跌破眼鏡;所以,使用前還是要得先熟悉產品,不然會出事。這裡摘錄精彩片段予以重播,Pitch by Pitch...! 釣魚網站有目前有兩個連結,可以參考先前 POST 的文章: 1.實戰釣魚網站(A):主要運用騙術。 2.實戰釣魚網站(B):除了騙術,還有些玩弄小程式,你能脫身嗎?
所以直接把 Google Chrome 瀏覽器,連線釣魚網站看看會有啥結果: (A)網站瀏覽結果,發現桌面上馬上多一個檔案,一開始還真的嚇一跳哩,瀏覽畫面如下。怎會發生這款事勒... 桌面多出的一個檔案,有心人士可是千方百計才有這結果的哩:
function confirmReset($token) { global $mainframe;
$db = &JFactory::getDBO(); $db->setQuery('SELECT id FROM #__users WHERE block = 0 AND activation = '.$db->Quote($token));
// Verify the token if (!($id = $db->loadResult())) { $this->setError(JText::_('INVALID_TOKEN')); return false; }
// Push the token and user id into the session $mainframe->setUserState($this->_namespace.'token', $token); $mainframe->setUserState($this->_namespace.'id', $id);
正確的修補方式應該是在資料庫中加上一個型態為 bit 的欄位,紀錄使用者是否有要求重設密碼。但是這樣的修補方式必須要更動到資料庫,而 Joomla 1.5.6 的修補方式只需要覆蓋一個檔案即可。我們認為 Joomla 這算是一個救火的修補方式,也期待在 Joomla 的下一個 major release 中,能夠以加上 bit 欄位的方式來修補這個問題。
看出端倪了嗎?知道上面連結或廣告的差異嗎?「Sponsored Links(贊助商連結)」、「Ads by Google(Google提供的廣告)」及google搜尋的結果,都是可以利用的,搜尋出來的網站可能就是釣魚網站。 我想十之八九都是很難分辨的,所以才會有一堆所謂的「網站信譽評等軟體」來幫你挑出已知有問題的網站;要特別注意的是有列出來的九成九是有問題,沒列出來的也有可能是有問題的,可以參考最後一段。
其實阿碼科技一年要去很多會議,但是大部分是參展,不單純是參加。可是我發現參展時我就比較不能專心聽演講,因為總是有 VIP 客戶會來 booth,那我就必須要在攤位「站台」。自己當講師的時候就更慘了,通常我都最後一分鐘還在做投影片。Black Hat / DEFCON 我們明年才會擺攤位,所以我今年就比較輕鬆些,可以享受專心聽演講的樂趣!不過這些會議跑多了,有經驗的講師一年中講的都大同小異,沒有經驗的講師,講的我又聽不太下去,有時也會覺得浪費時間。 Jeff Moss (aka Dark Tangent)是 Black Hat / DEFCON 駭客年會的創辦人與主席,每年的會上,他都會接受媒體的採訪。他今年的採訪,主要談到了地下經濟的成熟,對於駭客年會的影響。以下是訪問的影片:
在影片中 Jeff 談到,其實這幾年他的會議收到的投稿,品質有逐年下滑的趨勢。去年他覺得可能是現在資安會議多了,大家很多地方可以投,但是後來研究其他會議的內容發現,也並沒有,那究竟原因是為什麼呢?