Web應用程序中的rootkit
0×00 為什么我們會有這個想法
毫無疑問,Web是近幾年的熱點,各種各樣的服務都開始網絡化,用戶的敏感信息也開始不只是存儲在自己的計算機里,而開始存儲在服務提供商的數據庫里,用戶無須為這些數據的存儲和處理消費本地資源,只需要使用一個終端就可以訪問和使用這些數據,而這些終端往往只需要一個瀏覽器和一些小小的網速就可以了。這樣的服務非常多,譬如非常典型的一個例子就是webmail,用戶收發郵件,聯系朋友或者客戶,只需要打開瀏覽器就足夠了。
同時,對于攻擊者發生了一個什么樣的變化呢?隨著web的發展,越來越多的攻擊開始指向web。開始的某些時候,黑客可能可以通過web程序的某些漏洞而直接控制整個web程序,但是隨著廠商安全意識的提高和在安全方面的投入,攻克一個如gmail這樣的應用商已經不太現實了,那么自然越來越的攻擊開始在用戶使用的終端上,因為一旦能控制某個用戶終端的行為,實際上已經能完全控制這個用戶的所有信息了,盡管黑客不能攻陷web服務器,但已經足夠了。
但是這遠遠不夠,因為往往一次攻擊只能取得一次的效果,有沒有可能在攻擊成功之后,只要用戶再次登陸這個web應用程序或者再次使用這個web應用程序的時候都可以被我們監視到呢?有沒有一種類似于后門的方式長期潛伏在應用程序里,適時地為我們再次獲得該用戶的應用程序權限,或者為我們一直監視用戶的行為呢?入侵服務器很明顯是不太現實的,那有沒有可能以其他的方式實現呢?
0×01 Web應用程序后門的基本思想
傳統的后門都潛伏于被攻陷的系統中,基于應用程序的后門為了實現我們指定的一些功能,也必須潛伏于一個環境當中,并且可以在一定條件下得以運行。譬如一些經典的windows傳統木馬就是一個程序,在系統啟動的時候啟動起來。如果我們要控制一個應用程序,我們也必須需要一些代碼,而且在某些時候能夠運行起來。
那么我們的后門代碼可以存儲在哪里呢?現在的應用程序越來越復雜,用戶可以控制的東西也越來越多,用戶控制的東西最終是存儲在應用廠商的數據庫里,然后每次用戶需要的時候,這些數據才被取出來展現給用戶。那么很容易想到,存儲的問題比較好解決,我們的代碼其實是可以存儲在應用廠商的數據庫里的,甚至在某些條件下的Cookie也是可以作為代碼存儲地,只要它將進入到我們所期望的邏輯。
那么我們的后門代碼怎么樣才可以運行呢?數據在不被執行的時候,永遠不會有什么危害,所以執行是web應用程序后門的一個難點,不過也并非不可能。對于一個web應用程序,數據最終是要處理好展現給用戶終端的,這里的終端就是用戶瀏覽器,如果這些數據在輸出的時候沒有進行安全處理,是很有可能發生一個xss漏洞從而在用戶瀏覽器里執行js代碼的,利用js代碼,其實就已經控制了瀏覽器了。現在的web應用程序變得非常復雜,在進行安全處理的時候往往關注于外界來的數據的安全處理,而卻可能忽視來自于自身數據庫的數據的處理,拿一個webmail為例子,一般的思路往往把安全注重于在別人發送過來的電子郵件上(數據來自于外部),而對于用戶自身的數據(譬如郵件回復地址等個人設置選項,別人是無法控制的)卻缺乏安全的過濾,這就讓我們的后門獲得執行的機會。
那么我們的后門代碼可以做什么呢?像上面所說,我們的代碼執行的地點的不同決定了它可以做不同的事情,實現不同的目的。譬如如果我們的代碼在每一次登錄進應用程序都會執行的話,那我們就可以每次都可以獲取到用戶最新的登錄信息從而登錄進應用程序,這種機會盡管非常小,但是不是沒有哦!另外某些應用程序提供些特殊的功能,譬如webmail可能會提供郵件轉發的功能,那么我們可以利用這個功能來實現后門,但是這樣是非常不隱蔽的,用戶很可能會在進行郵箱設置時發現我們所做的修改,這個時候如果在同一頁面存在xss漏洞的話,我們就可以將這段設置從用戶的瀏覽器里抹除掉,并且對用戶在該頁面進行提交的動作進行監視,完全實現一個類似于rootkit的功能。我們所能作的,完全取決于應用程序自身的邏輯和我們的exploit點所處的位置。
0×02 實際應用中的一些例子
在07年的時候,我們曾經報告給Yahoo一個漏洞,在yahoo webmail的常規首選項里由于對回復地址的過濾存在問題,導致在這里寫入exploit代碼,可以在用戶登錄的時候就執行,從而實現一個后門,在每一次用戶登錄進yahoo webmail的時候就可以觸發。當時的exploit代碼:
在回復地址里寫上:
",aaa:alert(document.cookie),b:"@80sec.com
這部分代碼將在登陸時出現在頁面的js代碼中,并且由于對惡意字符的過濾不嚴格,導致執行js代碼。
該漏洞已經得到修復。最近在QQ Mail里出現的一個漏洞也證明了在實際應用中的可能性,在QQ Mail的常規設置面板里存在一個xss漏洞,一般安全人員對于這種漏洞都會忽視,因為這里的漏洞必須要求用戶已經登錄,并且自己對自己實現xss攻擊。但是一旦將漏洞利用到后門上,將會非常美妙,因為通過這里的xss可以修改用戶在設置面板里所看到的任何東西,并且對用戶的提交做自己的預處理,用戶可能永遠也不知道在這背后被人修改了什么,而這被修改的東西往往是非常重要的東西,譬如郵件轉發地址。
0×03 啟示錄
現在的web應用越來越復雜,各種客戶端技術如json,ajax,flash的使用,使得即使在客戶端往往也存在著各種各樣的輸入輸出邏輯,這也提供了更多的可能供黑客利用的地方。我們更傾向于將web應用作為一個獨立的系統來看待,數據的計算存儲都是在遠程的服務器上進行(類似于傳統的硬件資源),但是數據的展示和交互卻是在客戶端上(類似于傳統的操作系統),在這個操作系統上執行的任意的代碼都可能給這個系統帶來嚴重的安全問題,這樣我們在評估一個漏洞的嚴重性的時候,也需要結合具體的應用程序的上下文,不同的地方相同的漏洞執行相同的代碼,得到的效果也是不同的,而在考慮應用程序安全性的時候也該考慮那些來自于用戶的看起來比較可信的數據了。
轉載自:Web應用程序中的rootkit:http://www.80sec.com/webapp-rootki.html
【編輯推薦】