阿碼外傳-阿碼科技非官方中文 Blog: 2008年8月14日

2008年8月14日

談掛馬偵測: HackAlert 的架構與技術

看到我們技術長 Walter 貼了一篇自動爬行功能正式啟動的文,讓我想到許多往事,回家之前,貼一篇好了!

全網監控,說穿了就是爬行(Web crawling)的功能。其實整個 HackAlert 系統,我們早在 2001 年就實做過一遍,並在 2002 年大量掃瞄美國前五百大企業的網站掛馬情形,在 2002 年寫完論文投稿,被 WWW 2003 接受並提名年度最佳論文。雖然現在的系統是 Walter 帶領 X-Solve 團隊開發的,加上德籍 Web 2.0 介面設計團隊的火力,成品跟我們當年幾隻小貓的研究雛形當然不可同日而語,然而整個 HackAlert 系統,基本上還是分成兩個主要部分:A. 爬行器(crawler)的設計 與 B. Sandbox 的設計。(A) 是阿碼科技本來擅長的,而 (B) 則是生力軍 X-Solve 吃飯的本行。我先講 (A) 吧!

我們在 2001 年開始設計爬行器(crawler)時,就發現爬行器不容易設計:許多連結要填了表單(form)才能看到(還要填得對才算!),許多則要執行 javascript 或 flash 才會出現。除了這些,如何將各式各樣 encoding 的 URL 正規化(canonicalize),如何避免無窮回圈(recursive crawling),在網站不吐標準 error 404 的請況下如何判斷有效 URL... 都是爬行器設計時的挑戰。

如果現在回去看我們的 WWW 2003 論文,整篇有一半在講爬行器(crawler)的設計!爬行器的基本原理很簡單:給一個開始的連結(URL),然後利用這個 URL 找出其他的 URL,根據條件停止(例如其他 URL 都要在開始的 URL 之下等等)。

這篇論文是 2002 年寫完投稿的,那時我們把一個網頁中,會告訴我們新的連結(URL)的方法有(直接將論文畫面捕捉貼出):


最後自動填表單(form)指的不是亂填,而是要懂得意義的填,例如要名字填名字,要 email 填 email,要住址填住址,要郵遞區號填郵遞區號...

論文中我們說:「我們建立了一個測試網站,然後請用很多開放源碼或商用的爬行器(crawler)來爬行,也請 Google 來爬。我們測了:GoogleTeleport Pro(六年級的還記得吧?)、WebSphinxHarvestLarbinWebGlimpse,發現除了 Teleport,沒有其他爬行器可以處理第四種以上的 URL 產生方式,所以我們把我們的爬行器跟 Teleport 來做比較」。

比較的結果如下(直接將論文畫面捕捉貼出):


我自己看了一下,哇!當年原來我們有把趨勢科技的網站當測試資料ㄝ!根據我們這篇論文,當年趨勢的網站一共有70個表單,我們爬了5,781頁而 Teleport 只爬了 2,939 頁,差不多是我們的一半,嘿嘿,研究做得不錯喔!

嗯嗯,平均來說,我們的系統 WAVES 比 Teleport 多爬了 28% 的網頁。

這是怎麼達到的?簡單的來說,我們做了以下幾點是其他爬行器所沒有的:

1. 那時我們透過 COM 的 IWebBrowser2 直接使用 IE 的引擎,所以我們不但可以執行網頁裡所有的 javascript / flash / Java applet,還可以虛擬使用者的滑鼠擊點(click)。碰到 flash 的時候我們就每隔幾個畫素就按一次,碰到 javascript 的選單的時候也是一樣。

2. 因為我們直接掌握了 IE 的引擎,所以我們可以知道整個 DOM(document object model)最後被畫出來(render)的樣子,也就是說,我們知道每個字以及每個物件的位置。所以當我們看到一個要填字的空格(textbox)時,我們就水平地去找這個 textbox 左邊的字,然後我們有一整個智慧庫(knowledgebase),可以根據這個 textbox 周圍的文字描述,以及他本身的 HTML 名字與變數,綜合起來決定,這個欄位要的是什麼值(姓名、電話、email、住址?)。

為什麼我們花這麼多時間做爬行器(crawler)?因為對於黑箱的技術來說,不論是偵測網站掛馬,或是做自動的黑箱滲透測試,都需要好的爬行器。今天的網站,動不動上千頁,沒有好的自動爬行技術,連攻擊點(attack surface)都會蒐集不完全,更何況其他。自動滲透測試的話,如果一個表單十個欄位,你想自動 SQL inject 其中一個欄位,那你最好把其他九個欄位填對。只要有一個欄位你沒填對,例如要郵遞區號結果你填 email,那在伺服器端的程式(server-side script),會還沒做到資料庫指令(SQL command)就先停了,因為你有欄位沒填好。當然如果他每個欄位都有檢查,那就沒有漏洞,那沒話說,但是通常不是這樣,很多人都只檢查特定幾個欄位,那麼其他欄位就會有 SQL injection 漏洞了。阿...我說得太亂了嗎?簡單的說,填對越多,越有機會 pass 過前端的 validation procedure 啦!

所以說,爬行器很難做;喔,應該說,「好的」爬行器很難做,爛的滿街都是。事實上我覺得,爬行器會是一個黑箱技術好壞的關鍵。

當初這篇論文 WAVES ,為了要投上 WWW,我們把自動黑箱滲透測試與自動掛馬偵測兩個技術都寫入其內。很多人問我們為何將網頁掛馬自動偵測技術產品化,而自動黑箱滲透測試卻沒有?答案其實很簡單,當初的 WAVES 系統整個都沒有商品化。現在的 HackAlert,是 X-Solve 與我們結合後他們團隊做出來的,跟我們原本的 WAVES 系統沒有關係;HackAlert 在各種方面,也複雜,成熟許多(當然啦!經過了六年了!)。至於原本 WAVES 的自動黑箱滲透測試部分,則由於我們後來做了白箱源碼檢測 WebSSARI 技術,重新商品化成 CodeSecure 之後,就沒有必要再做黑箱的了。

好,講完(A)爬行器的技術,來談談(B)sandbox 的技術吧!

Web 測惡意程式都經過層層的加殼與變形,要偵測 Web 惡意程式,無法用靜態的分析來達成,必須用動態的 sandboxing 技術。事實上,Web 的惡意程式已經對防毒產業造成的相當的困擾。底下這個圖是擷取於賽門鐵克 2007 後半年威脅報告(Symantec Internet Threat Report 2007):



這個圖是每半年,新的惡意程式出現的數量。賽門鐵克的報告中將 2007 年惡意程式在數量上的驚人成長,歸咎於 Web 惡意程式的氾濫。事實上也是如此。

Web 惡意程式,大都經過加殼,不論是 javascript 掛馬,或後續再下載回來的惡意程式,都會經過加殼變形。這其中尤其又以 javascript 為最難,DEFCON 我聽到一場演講,講師(現在是我好朋友了)展示了一種新的 javascript 變形觀念,非常具有創意,也不容易偵測(我之後會寫)。

其實即使一般 javascript 編碼/變形,就不容易偵測了。除了大家熟悉的 MPack 商用加殼軟體外,現在線上的 javascript 編碼/變形服務也到處都是:看這裡這裡

要解出這些加殼或變形的惡意程式,靠防毒軟體沒有太大效果,必須要靠動態的 sandbox (沙盒)。

不止要有 sandbox,還需要有整個 DOM(Document Object Model);或乾脆說,要有整個瀏覽器的環境。很多人想偷懶,用 spidermonkey 來做(SANS最近也玩了一下),但是就如同 SANS 的 Daniel Wesemann 說的:「But SpiderMonkey is only a JavaScript engine - it doesn't emulate the browser and doesn't even have a "document" or "location" object...」。

Spidermonkey 是一個 javascript 執行器,但是不是一個瀏覽器,還缺很多環境,雖然可以用它貼貼補補來做惡意程式偵測,我們當初還是決定打正規戰--建立完整的沙盒(sandbox)環境。

當年我們的 WAVES 論文,是利用 detours 這個含式庫,來建立自己的 sandbox,一共攔截了以下的含式(直接將論文畫面捕捉貼出):



當時關於沙盒的建立,資訊還不太多,大部分靠社群朋友的分享。

現在好的 sandbox 很多了,我前幾天貼的文--Black Hat 2008 第一天觀察中就有提到,像是 Paul Royal,講的就是他利用 Intel VT 建立的一個 sandbox 環境,並且有跟其他 sandboxing 技術比較。

Sandboxing 大致上可以說有四個目的: 1) 限制惡意程式不能讓其逃離 sandbox,2) 要讓惡意程式正常執行,包含正常脫殼與攻擊等,3) 不可以讓惡意程式發現它正被放在 sandbox 中執行, 4) 需要讓惡意程式展現行為。很多 sandboxing 技術做到了 1-3,但是無法做到(4)。

例如,如果惡意程式就是硬等個三十分鐘,才觸發攻擊,那麼如果 sandbox 只有三分鐘觀察時間(HackAlert 總不能掃一個網頁要三十分鐘吧?),就無法觀測出惡意的行為,而會提早收工而誤判了。

這就是當初我們 WAVES 論文中所提的「Behavior Stimulation(行為觸發)」的概念。在這方面,X-Solve 的加入是超級的生力軍,他們帶來了 Archon 引擎,也催生了 HackAlert

HackAlert 是免費的服務,歡迎各位註冊使用;如果想很快看看它的介面,可以看一下 Walter 貼的「自動爬行功能正式啟動」那篇。

如果要比較 HackAlert 偵測惡意程式的功力到底如何,可以找一些厲害的惡意程式試看看,如果手上沒有,MalwareGuru裡有一些;MalwareGuru 是一個 wiki,歡迎您直接註冊帳號參與 :)

至於很多人問我,為何最近都談惡意程式沒有談我們的白箱工具 CodeSecure ?是的,CodeSecure 還是我們主力產品,原因很簡單,HackAlert 隨便一寫就花我兩三個小時去了,CodeSecure 的技術更難,大家更不熟(喔?你 advanced compiler / formal methods / model checking / programming language 都修過?okok...我是指正常人),我每次想寫就手軟(尤其 CodeSecure 的工程師都超忙,更不可能幫我)...不過既然大家這麼有興趣,我下次再寫好了,先讓我把 Black Hat 還有 DEFCON 寫完吧!

最後,看到今天的 HackAlert 做得這麼成熟,心裡真的很高興,把當初論文上登的 WAVES 畫面切下來貼一下好了。現在 Walter 帶著 X-Solve 團隊做,以前這東東幾乎我一個人寫的勒!雖然跟 HackAlert 沒太大關連,貼一下紀念紀念啦!



作者 Wayne 為阿碼科技 CEO

繼續閱讀全文...

網頁掛馬檢查服務--全網監控功能啟動!

去年,隨著掛馬手法在駭客集團中流行,客戶不但害怕被入侵,被掛馬,也害怕被 Google 點名。今年初我們釋出了 X-Solve 團隊加入後共同努力打造出的免費 HackAlert 服務。當時因為駭客掛馬大多只掛在首頁,HackAlert 的單一URL監控就足夠應付:



然而自今年年初,我們的團隊監控到了有種自動化的大規模 SQL Injection 加掛馬攻擊,在每週末準時報到 (阿碼新聞稿PC World(IDG)ITHome),讓不少人半夜接到關切電話,而 HackAlert 與 SmartWAF 也收了不少樣本下來...

但很多客戶的網站都很龐大,URL也常變動,單一 URL 監控要定期更改實在不方便,所以我們開始設計能夠定期自動監控全網並自動進行掃描的企業級監控功能,並在最近終於釋出正式的版本,我在這邊一步一步帶大家使用:


1. 首先,登入後的空白頁:


2. 點選「新增專案」,會出現設定精靈
我們指定要監控這個眾多阿宅常去的著名網站 (hxxp://waigua.tw)



3. 新增完畢,點「Scan Now」就會開始全站檢查:


下圖是爬完的結果:

全站檢查會開始 crawl 整個網站,目前的版本總共找到400頁,用Google查詢的話,會找到158筆左右:



4. 接著就可以到專案統計表去看全網掛馬偵測結果
(測試時間為2008年8月14號下午5點左右):


看來很多頁都很精彩,總共有98頁被掛,玩 game 練功順便開動物園。


5. 但是 HackAlert 不只告訴你哪個網頁已經被掛 (徵狀),還可告訴你木馬怎麼被下載的 (證據):

首先, 把滑鼠移過去就會看到點選提示:


反白後按下去,就會看到看到木馬下載被 HackAlert 記錄的過程:

再來一張:



6. 企業客戶可以啟動 syslog 通報以及查閱記錄功能:



有了全網監控功能之後,不論是掛在首頁或是藏在深處的馬,都能被更有效的發現,有興趣的話,,可以跟我們聯絡,透過 http://hackalert.armorize.com 首頁上的 Contact Us 就可以找到我們。

作者 Walter 為阿碼科技 CTO

繼續閱讀全文...