2012年9月28日 星期五

中毒與檔案搜尋技巧(Infected file search skills)

現在因為電腦化相當深,所以人人幾乎都是聞「」色變(重點是:如果有發覺的話!),先不論自己有沒有發現,但是在系統管理上,每次遇到這種棘手的問題時,往往解決的速度就會決定你被釘在牆上的時間,以Windows來說,絕大多數的工作環境裡,應該都有商用版的防毒軟體可以撐著,原則上應該也不會遭受到多大的破壞,除非有自作聰明的使用者,或是不受控制的某某人,不然,除了0-day攻擊之外,應該都還是可以有一定的能力可抵擋。

不過,若是換成非Windows系統的架構呢?我相信大多數非Windows系統的主機上,都沒有安裝類似我們在Windows上的防毒軟體,縱使有,應該絕大多數也是針對特定服務,例:電子郵件系統,除此之外,若是其它的服務遭受攻擊,往往都會是別人先通知你居多,如果是租用虛擬主機,一般來說,主機商會收到使用者特定監控機構的回報,然後,你就會發現自己被主機商給關了,接著就是一連串的郵件往返和緊急處置,這時候搜尋技巧很有可能就會救你一命,尤其是在追蹤感染的檔案,或是藉此找出中毒發病的主因躲在那兒。

其實搜尋的技巧,應該對於很多人來說,不就是快速鍵的「Ctrl + F」嗎?這那有什麼技巧呢?

在大多數的狀況下,的確是這麼說沒錯,不過,這就跟Google人人會用,但是為什麼總是有些人能夠找得比你精準、比你快呢?這就代表所就算工具一樣,還是因它的使用方式而有不同,其實,就連是一般Windows所提供的搜尋,也有不少參數可以使用,只是一般人不是這麼常用它而已,例:特定時間特定檔名特定修改時間特定檔案大小...等。

Windows 進階搜尋


除了這種搜尋外,其實現在也有不少軟體有類似桌面搜尋的常駐程式在運行,這時候可以大大地縮短你搜尋的時間,有興趣的可以到這邊去下載(KB940157:適用於 Windows XP 的 Windows Search 4.0),如果你是Win7 原則上內建的搜尋功能就與這個相當貼近,當然你也可以透過第三方發布的搜尋程式,不過像Google Desktop,卻在去年九月就宣告要將它關閉,這還是跟軟體商的定位有關。

不過,以筆者自己來說,不喜歡增加常駐程式的負載,所以我個人通常都會將相關軟體移除,再特定需求時再自行搜尋我想要的內容,因為真的有需要時,怎麼樣找到我需要的檔案,可能比它幾秒鐘回覆我結果來得更重要。

那麼,如果是非Windows的平台呢?這個搜尋要怎麼使用呢?我想在Linux系統架構下,最常使用的應該就是find這個指令吧?至於用法你可以自己透過man find去查看系統所支援的參數之外,你也可以到鳥哥的網站看看它對於這個指令的說明(鳥哥的Linux私房菜-find),我相信我再怎麼解說,應該也跳脫不出上面的內容,所以有興趣的可以去查看一下它能怎麼使用,我這邊主要要提的是,在你得知感染病毒或是被塞東西時,可以考慮的切入方向。

1.先追查Log檔:
追查Log絕對是系統分析的第一件事,原因無它,雖然你或許可以依據被告知或是軟體偵測出來的內容,來進行分析,但是難保不會有落網之魚,再來通常攻擊的方式往往不會只有一種,有的是屬於潛伏型的方式,就算你以為已經把問題排除,其實依舊有留下禍根,這時候你可能就得透過Log檔來追蹤是否有其它可疑的內容塞進來,或是有檔案可能被竄改,往往都是在相近時間相同來源(IP)或是特定資料夾之下。

這時候你需要的可能就是大量的資料處理,因為愈多人使用的主機,Log檔的大小也是以倍數的方式成長,如果是非Windows的架構,必要的話,你可以將Log檔轉至Windows中再來透過第三方的文字編輯軟體剌協助處理,例:pspad......等,不然你可能就得透過組合的指令來進行資料的篩選跟分析,這時候可能就是要用到sortgrepwcawk...等指令的應用,如果你的操作環境中沒有Winows可提供其它軟體的支援,似乎也就只能夠練功,不過只要使用過一次包準你功力大增,這邊主要是以搜尋及切入角度來討論,所以就沒有多做指令的說明。

2.搜尋特定時間段的檔案:
在查看完Log檔之後,或許你需要針對特定時間點有進行修改的內容,一一清查時,這時候你可能就會需要針對特定時間來進行搜尋,在Windows的系統架構中,本身就提供進階搜尋的功能,若是非Windows的系統可透過find的組合指令來搜尋。
例:搜尋/XXX/XXX/資料夾中,十五天前有變更過內容的php檔,並且將其刪除
find /XXX/ -name '*.php' -mtime +15 -exec rm {} \;
如果擔心刪太快的話,你可以先不寫-exec之後的內容,查看過搜尋出來的結果後再來決定,或是直接將指令改為:
find /XXX/ -name '*.php' -mtime +15 -exec rm -i {} \;
這麼一來就會逐筆確認是否刪除,以免刪錯檔案,這種主要是透過搜尋功能來找出被加料或是硬塞進來的檔案。

3.搜尋特定大小的檔案:
在搜尋完特定時間的檔案之後,或許可以針對特定可疑檔案來進行追蹤,基於許多惡意程式變種的型態,往往會自體複製,但是其內容是相同的,但是在檔案名稱上會有所不同,這時候你就可以透過不同的搜尋方式來處理。
例:搜尋/XXX/資料夾中,列出檔案大小在22K到23K之間的php檔,再進一步篩選出大小為22318的檔案
find /XXX/ -name '*.php' -size -23k -size +20k -exec ls -l {} \; | grep 22318
其實你當然也可以直接搜尋大小為22318的所有檔案,不過,我這邊主要是順便介紹一下類似的組合搜尋方式如何使用,我相信有經驗的人都應該有自己的一種搜尋習慣,並沒有絕對的標準。

4.修補相關程式或關閉特定功能:
一般來說,系統本身除了有被揭露的弱點之外,一般來說狼通常都是我們自己請進來的,愈少的服務可能有的風險愈少,或是有些很炫的特效或是功能,對於系統安全和一般使用者來說,並沒有太多力量來防範,但是卻又得接受某些需求的開發(限時開發),一來一往之間,悲劇大多是這麼造成的。(這也是現實的狀況居多)

所以,這時候可能就要回頭來看是否系統架構可以抽離,針對需要的部份進行版本更新和弱點防堵,如果不行的話,可能就會面臨一種狀況:「因為這個功能牽涉太廣,所以不能更動刪除」,然後就是有永遠排解不完的狀況和問題(我相信很多大型網站的維護者都心有戚戚焉),或者是一句:「這功能不是我寫的,所以$#%$#%@#$」,我相信如果是跟公司營運直接相關的功能,或許還會被要求硬著頭皮改掉,如果不是的話,往往就會「船過水無痕」,大事化小、小事化無。

通常這種狀況都是只有內部的人緊張的要死,然後外面的人霧裡看花居多,畢竟現階段來說,我相信很多在營運的系統,對於這部分提供保護的投資相對還是少數(並非創造營利的主軸),這時候最好的狀況就是有所取捨,如果可能的話,寧可不要那些酷炫的功能,進而賠上安全,因為只要一出事,我相信對於維護人員或要負責的主管來說,絕不會因為你先前提供了什麼酷炫的功能而能功過相抵(況且前功不抵後過),這或許也是為什麼很多程式人員會被人說很難搞的主因吧!(後勤支援性質的工作都有類似的狀況)

5.清查與備份資料的差異:
若是真的在你清查之後,依舊有相關的風險問題,這時候你可能就要忍痛進行資料回覆,這就有點像名言:「電腦有問題,重灌就會好」一樣,在找不出問題點之前,最快的方式就是透過重新建置,但是那是不得已的做法,最常見的方式是回覆到特定時間點之前,以降低損害的程度,這就跟你備份資料是否夠完善而定,或者是你能夠針對特定時間備分的資料進行比對,但是,老實說這真的是件曠日費時的工作,因為你可能要比對的內容會遠超過你的想像,而且在過程中變更過的資料(程式、暫存資料、寫入設定)往往很容易會造成誤判,這除了時間外,有時可能還需要點經驗和運氣,這也就取決於那寫資料的重要程度為何,。

最後,最糟的狀況就是砍掉重練,這時候就是考驗平常資料備份型態,以及是否能夠各別處理有關,但是,如果沒有辦法找出病灶,很有可能就算回覆到最早的時間點,一樣是有毒的糖果,所以系統分析的工作,除了上述的切入點之外,或許有更多是經驗的判斷,甚至尋求某些有能力進行破壞的人,雖然有時像「請鬼拿藥單」,但是,就算是Hacker也是有分黑帽和白帽的不是嗎?

以上,是提供一些初期的解決和判斷方法,當然也是有不少協助的工具或許可以協助你偵測出問題出在什麼地方,但是那往往會牽動的層面更廣,甚至有可能會拖垮系統效能,所以具備特定的搜尋技巧,對於系統分析上是必要的,當然,還是希望大家都不會有需要用到這些技巧的一天!(傻笑)