Posted on 2010-01-08 17:42
S.l.e!ep.¢% 閱讀(321)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
RootKit
網(wǎng)游木馬防御技術(shù)漫談
2008年06月04日 星期三 下午 10:40
大家好!首先講講網(wǎng)游木馬常用攻擊技術(shù)。第二,講講從開(kāi)發(fā)商的角度,以較低的成本實(shí)現(xiàn)防御網(wǎng)游木馬的策略。首先是鍵盤記錄,所謂的鍵盤記錄是在在鍵盤輸入的時(shí)候木馬會(huì)把你的鍵盤輸入的信息記錄下來(lái),網(wǎng)上流傳最廣、最通俗的方法就是安裝全局消息鉤子,從而竊取密碼。原來(lái)消息鉤子這種進(jìn)入密碼的方法用得比較多,但是從2006年起主動(dòng)防御的流行這類方法會(huì)被行為監(jiān)控?cái)r截,比如卡巴斯基這種主動(dòng)防御就防這個(gè)。后來(lái)逐步地有一些黑客發(fā)掘出以前使用的比較少的被廠商所忽視的一種方法,例如圖片上舉到的這些(圖)。
前面幾個(gè)安裝全局消息鉤子、GetKeyState、GetAsyncKeyState 、 DirtecX接口的方法是從用戶態(tài)實(shí)現(xiàn)的。原始輸出設(shè)備raw input用它來(lái)竊取密碼,這也是屬于用戶態(tài)的。鍵盤過(guò)濾驅(qū)動(dòng)以及掛鉤鍵盤驅(qū)動(dòng)的Dispatch例程等方法屬于核心態(tài)實(shí)現(xiàn)的。 Ppt中后面提到的所謂的Inline Hook是廣義的,就是我進(jìn)行掛接的時(shí)候可以在Rin3上掛,也可以在Rin0下掛,我的hook可以掛在自己的游戲程序里面,從而獲取密碼,深入的話也可以深到話kbclass設(shè)備的回調(diào)函數(shù)。突破nPtotect保護(hù)也不難。
第二部分是內(nèi)存讀取。用戶輸入密碼后,通常情況下密碼沒(méi)有經(jīng)過(guò)處理的話,有一段時(shí)間用戶輸入的密碼會(huì)以明文的形式存放在內(nèi)存中,包括登錄游戲后,游戲中人物裝備等級(jí)等信息都可以從游戲進(jìn)程的內(nèi)存中讀取。
第三是星號(hào)密碼獲取以及緩存密碼,比如在QQ或MSN上輸入密碼的時(shí)候,可以選擇記錄密碼的情況。 使用GetWindowText函數(shù)就可以獲取常規(guī)的星號(hào)密碼,當(dāng)然對(duì)于具有密碼屬性的輸入框在GetWindowText之前需要使用SendMessage取消其密碼屬性。
下面講到瀏覽器插件,主要用于獲取IE相關(guān)的信息,也可以用來(lái)突破HTPS。
來(lái)看張圖片,小區(qū)域精確截圖(圖),這種方法可以應(yīng)對(duì)許多種網(wǎng)游的保護(hù)措施,先安裝一個(gè)全局鼠標(biāo)鉤子,對(duì)你鼠標(biāo)點(diǎn)擊的時(shí)候,比如鼠標(biāo)點(diǎn)擊這邊,事先算一下你的按紐的像素,把邊長(zhǎng)除以二,以鼠標(biāo)點(diǎn)擊的點(diǎn)為正方形的中心,從而以這個(gè)點(diǎn)截取一個(gè)正方形,面積最大的就是我們所要的密碼信息。小區(qū)域精確截圖的方法和圖象識(shí)別,從而可以把圖象信息直接轉(zhuǎn)化為字符。如果說(shuō)比較復(fù)雜,圖象識(shí)別不了的話,黑客們常使用的方法就是發(fā)郵件,因?yàn)榘l(fā)郵件是可以以HTML的方式,從而可以把圖片嵌在里面,黑客收到信的時(shí)候,看密碼就一目了然。雖然是截取的圖,但是也能很清楚地看到。
除了剛才講的這些,下面還有應(yīng)用得比較廣的,例如封包截取或者協(xié)議分析,從協(xié)議的角度分析人物信息、用戶名、密碼。現(xiàn)在還是有一些比較厲害的人可以通過(guò)調(diào)試,逆向工程,結(jié)合ARP欺騙,對(duì)于非對(duì)稱密鑰加密的話,傳統(tǒng)的破解方法比較困難。但是在局域網(wǎng)里面可以結(jié)合ARP欺騙、偽造,實(shí)現(xiàn)相應(yīng)的效果。基本上現(xiàn)在的木馬在對(duì)付非對(duì)稱密鑰加密的時(shí)候基本上是采用欺騙的方法。
還有一些其他技術(shù),比如一些猥瑣方法,談技術(shù)含量比較低,但還是有效果。舉一個(gè)例子,很久之前人家想到QQ密碼,他自己寫一個(gè)界面和QQ基本上差不多的,然后輸入之后,再把真正的QQ進(jìn)程運(yùn)行起來(lái)。這是被人鄙視的方法,要鉆空子的話還是比較多的。幾年前盛大對(duì)安全很重視,那時(shí)候推出的盛大密寶,但它那種對(duì)于真正想竊取的人也是形同虛設(shè),但是那個(gè)可能比較困難,或者還需要入侵它的服務(wù)器,把相應(yīng)的算法搞清楚。這是比較困難的,但是用得比較多的,現(xiàn)在很容易實(shí)現(xiàn)的就比如這張圖(圖),我們后面講的解決方案也會(huì)碰到類似的問(wèn)題,對(duì)于盛大密寶使用的這些方法,我先簡(jiǎn)單地把盛大密寶的使用過(guò)程講一下。
在輸入用戶名、密碼后,它會(huì)又出現(xiàn)一個(gè)對(duì)話框,盛大密寶是以1分鐘為間隔。以一分鐘為單位,有一個(gè)函數(shù),那個(gè)函數(shù)有兩個(gè)變量,盛大密寶的序列號(hào)做了變量,還有一個(gè)變量就是和時(shí)間相關(guān)的。以一分鐘為單位,會(huì)隨機(jī)生成六位數(shù),但是登錄之后游戲里面就會(huì)隨機(jī)抽取三位,請(qǐng)你輸入盛大密寶,所謂盛大密寶就像U盤大小,中間有一個(gè)寫字屏,以一分鐘為單位,按照它的算法隨機(jī)生成六位數(shù),游戲的程序比如說(shuō)請(qǐng)輸入第一位、第三位、第四位,從六位數(shù)里面選三位數(shù),讓你輸入第幾,這是游戲隨機(jī)的。以我們常人的角度看來(lái)就很安全,安全性很高。但是還是能被破解,原理就是這樣(圖)。
比如這里有兩臺(tái)機(jī)器,這臺(tái)機(jī)器上面已經(jīng)感染了能夠破解密寶的高級(jí)木馬,攻擊者已獲取初次登錄及的用戶名、密碼。攻擊者用已獲得受害者的用戶名密碼登錄。當(dāng)受害者登錄游戲時(shí)輸入的用戶名和密碼已被木馬程序換掉,登錄另外一個(gè)無(wú)關(guān)帳戶。為什么木馬要在受害者登錄時(shí)把他的帳號(hào)密碼換成其他帳號(hào)呢,因?yàn)橐粋€(gè)帳號(hào)不能同時(shí)登錄。這樣受害者輸入自己的用戶名、密碼的時(shí)候其實(shí)已經(jīng)變成另外一個(gè)人的帳號(hào)了。他進(jìn)去之后會(huì)出現(xiàn)一個(gè)框,要求輸入盛大密寶隨機(jī)生成的6位數(shù)中的3位數(shù)。而且3位數(shù)的序號(hào)是給定的,比如第一位、第三位、第四位的六位數(shù)。從六位里面選三位位置是隨機(jī)的。攻擊者登錄后出現(xiàn)密寶信息輸入框,比如說(shuō)請(qǐng)輸入六位數(shù)里面的第四位、五位、六位。如圖,攻擊者只需在木馬控制端里輸入四、五、六,點(diǎn)完發(fā)送。此時(shí)木馬端收到信息后就會(huì)把受害者的第一位、第三位、第四位提示信息換成四、五、六位。這樣受害者就會(huì)輸入盛大密寶隨機(jī)生成的6位數(shù)第4、5、6位數(shù)字,這正是攻擊者登錄游戲所需要的信息。所以攻擊者就實(shí)現(xiàn)了破解盛大密寶保護(hù)的效果。
因?yàn)楹诳瓦M(jìn)入游戲之后防止他再重新進(jìn)入,發(fā)現(xiàn)帳號(hào)正在使用,可以在我們的木馬端做一些手腳,攔截封包兩三分鐘內(nèi)讓他上不了網(wǎng),等他看看是否有一些有價(jià)值的裝備或者游戲幣,等處理完之后再讓他上線。或者暴力一點(diǎn),就是直接終止進(jìn)程。也可以掛鉤NtCreateProcess/Ex、NtCreateSetion,在一定時(shí)間內(nèi)禁止次進(jìn)程創(chuàng)建。
從內(nèi)存讀取的方法在木馬里面也是使用得非常廣泛的。在QQ稍微老一點(diǎn)的版本也是同樣存在內(nèi)存里面。現(xiàn)在有一些網(wǎng)上銀行及游戲,他可能采用軟鍵盤,我剛才說(shuō)的對(duì)付軟件盤通常有兩種,一種是截圖的方法,還有就是掛鉤TextOut函數(shù),取得軟件中的字符,類似于金山詞霸的技術(shù),也就是是屏幕取詞,用戶點(diǎn)擊點(diǎn)密碼時(shí)已經(jīng)被屏幕取詞獲得密碼的字符信息。我這里講的是一些主流的,還有針對(duì)特定的情況有一些比較猥瑣的方法。
剛才是從攻擊的角度進(jìn)行分析的。現(xiàn)在開(kāi)始講怎樣防御。考慮防御站的角度不同,比如游戲開(kāi)發(fā)商是從自己寫游戲的角度。從第三方安全軟件開(kāi)發(fā)商,比如瑞星、卡巴斯基,或者從使用者、網(wǎng)絡(luò)管理員,比如網(wǎng)絡(luò)管理員怎么樣從邊界防火墻角度怎樣進(jìn)行相應(yīng)的配置。現(xiàn)在我講的主要側(cè)重于游戲開(kāi)發(fā)者的角度。從游戲開(kāi)發(fā)商的角度和第三方安裝軟件的防御角度還是有區(qū)別的。因?yàn)槿绻怯螒蜷_(kāi)發(fā)商的話,他做防御是要小型化,主要針對(duì)我自身的特性。不像安全軟件可以做的很全面很龐大。 從游戲開(kāi)發(fā)商的角度是怎樣做最少的事情取得自身游戲的安全性。
我們先從基于主機(jī)的角度談一談。我們剛才已經(jīng)粗略地了解了網(wǎng)游木馬的密碼獲取常用手段,對(duì)應(yīng)地我們要將緩存密碼加密,自定義窗口類對(duì)相應(yīng)讀取密碼內(nèi)容的窗口消息進(jìn)行處理,從而使它用傳統(tǒng)的方法獲取不到密碼。第二是防范按鍵記錄,雖然這只是簡(jiǎn)簡(jiǎn)單單幾個(gè)字,我是把涉及到的面講一講,同樣是一個(gè)防范按鍵進(jìn)入,可以做得很淺,但同樣也可以做得很深。越深入底層公開(kāi)的資料越少,操作的系統(tǒng)提供的現(xiàn)成接口比較少,需要自己做的比較多,所以難度系數(shù)增大,從而會(huì)寫的人就比較少,安全性就提高了。但是隨著防御越往底層做,雖然安全性提高了,但是穩(wěn)定性也下降了。從理論上說(shuō),只要原理正確的,也是可以做到穩(wěn)定的。但是因?yàn)檫@些東西是人開(kāi)發(fā)的,由于水平、經(jīng)驗(yàn),尤其是開(kāi)發(fā)時(shí)間的限制,沒(méi)有那么多時(shí)間去測(cè)試,沒(méi)有時(shí)間經(jīng)過(guò)多種客戶環(huán)境的考驗(yàn),所以想推出一個(gè)非常底層的產(chǎn)品級(jí)的、比較穩(wěn)定的,時(shí)間會(huì)比較漫長(zhǎng)。現(xiàn)在防范鍵盤記錄的一個(gè)比較底層的比較穩(wěn)定的方法是掛kbclass中的KeyboardClassServiceCallback,兼容性也較好,兼容USB、PS/2的。
原來(lái)QQ采用的是虛擬鍵盤,虛擬鍵盤其實(shí)也是一種成本較低效果較好的方法。但需要防御我剛才說(shuō)那些密碼竊取方法,比如掛鉤TextOut的屏幕取詞以及小區(qū)域精確截圖。另外就是軟鍵盤中按鍵的順序要隨機(jī)生成,還有就是軟鍵盤在屏幕上出現(xiàn)的位置最好也要隨機(jī),如果大鍵盤位置固定的話還是很容易被盜取。還有就是最好不用字符,用比較復(fù)雜具有較強(qiáng)干擾性的圖片,這樣圖象解析就比較困難,一般只能用截屏。我們現(xiàn)在已經(jīng)知道的屏幕截取的方法通常是CreateDC和模擬鼠標(biāo)按鍵PrintScreen鍵,所以只要掛鉤相關(guān)函數(shù)就可以防止截取。從產(chǎn)品可用性的角度,在輸入密碼的一分鐘之內(nèi)對(duì)截屏功能禁用,這樣對(duì)可用性也沒(méi)有什么影響,而且避免了因交互式保護(hù)的煩瑣帶來(lái)的用戶體驗(yàn)下降的弊端。
還有一種是在網(wǎng)吧里比較盛行的基于ARP欺騙竊取整個(gè)局域網(wǎng)內(nèi)的游戲帳號(hào)信息。現(xiàn)在網(wǎng)吧基本上都是交換機(jī)的,基本上都是通過(guò)ARP欺騙的方法,就可以破取局域網(wǎng)里面其它機(jī)器的分包,如果能把網(wǎng)游的協(xié)議逆向分析出的話,就可以破解獲取整個(gè)局域網(wǎng)里所有使用游戲用戶的信息。對(duì)于網(wǎng)吧和局域網(wǎng)用戶,防范ARP欺騙是很有必要的。
網(wǎng)游木馬使用的各種密碼竊取技術(shù)都會(huì)使用到相關(guān)的函數(shù),從基于主機(jī)主動(dòng)防御的角度,對(duì)相關(guān)函數(shù)掛鉤實(shí)施行為監(jiān)控即可防御相應(yīng)密碼防御技術(shù),如 NtOpenProcess、NtReadVirtualMemory、NtUserSetWindowsHookEx、CreateDC等 。其中掛鉤NtOpenProcess/NtReadVirtualMemory用來(lái)防范木馬程序讀取游戲程序進(jìn)程空間中的密碼,NtUserSetWindowsHookEx用來(lái)防范安裝全局鉤子。另外還可以枚舉設(shè)備棧,對(duì)鍵盤過(guò)濾驅(qū)動(dòng)進(jìn)行檢查。 通常安全軟件中使用較多的是編寫驅(qū)動(dòng)程序掛鉤SSDT,還有少部分inline hook。去年出現(xiàn)的比較多的安全軟件的驅(qū)動(dòng)漏洞不少是因?yàn)镾SDT掛鉤后的處理函數(shù)編寫不完善,所以實(shí)現(xiàn)行為監(jiān)控功能時(shí)我們自己的處理函數(shù)也要寫得很健壯,防止漏洞的產(chǎn)生。
對(duì)于防御ARP欺騙,通常采取NDIS HOOK或者NDIS IMD技術(shù),截取ARP包進(jìn)行分析,丟棄偽造的欺騙包。另外實(shí)現(xiàn)還應(yīng)建立一個(gè)可信的IP-MAC庫(kù),所謂的可信基就是在確保網(wǎng)絡(luò)沒(méi)有欺騙的情況下,確保其他機(jī)器尤其是網(wǎng)關(guān)的IP-MAC映射關(guān)系,先把它存起來(lái),然后截取到ARP封包時(shí)與事先建立的可信IP-MAC關(guān)系進(jìn)行比較判斷。還有一個(gè)是比較簡(jiǎn)單的,就是用系統(tǒng)自帶arp命令實(shí)現(xiàn)IP/MAC綁定的,但是對(duì)于Windows2000應(yīng)該是沒(méi)有用的,這點(diǎn)網(wǎng)上幾乎沒(méi)有披露,印象中只有flashsky以前提及過(guò)。因?yàn)閃indows2000沒(méi)有檢查IP-MAC綁定是靜態(tài)的還是動(dòng)態(tài)的,雖然進(jìn)行了綁定,但只要有ARP請(qǐng)求/應(yīng)答包,WIindows系統(tǒng)還是會(huì)把偽造的IP-MAC對(duì)應(yīng)關(guān)系添加到自身的ARP緩存表中。ARP的綁定功能在Windows2000里面形同虛設(shè)。所以通用有效的還是使用驅(qū)動(dòng)利用NDIS HOOK/NDIS IMD技術(shù)攔截ARP包分析過(guò)濾。
有些情況下要獲取游戲密碼以及人物信息的話,最好到它的進(jìn)程空間里面去,所以有很多木馬就把自己的dll先注入到你的游戲進(jìn)程里面。但是現(xiàn)在許多安全軟件比如卡巴7、江民2008都采用的主動(dòng)防御技術(shù),而已防范常規(guī)的諸如CreateRemoteThread、SetThreadContext等注入技術(shù)。為了繞過(guò)主動(dòng)防御以及實(shí)現(xiàn)自啟動(dòng),某些木馬利用了Windows一個(gè)簡(jiǎn)單的系統(tǒng)機(jī)制,就是目錄的優(yōu)先級(jí), 具體講如果當(dāng)沒(méi)有寫絕對(duì)路徑只是相對(duì)路徑,調(diào)用dll時(shí),優(yōu)先加載同目錄下的,然后才是系統(tǒng)目錄。比如在網(wǎng)游目錄下釋放一個(gè)kernel32.dll,kernel32.dll所有Ring3程序都需要用到的吧,所以只要你的游戲程序運(yùn)行起來(lái)了,木馬釋放的kernel32.dll也就注入到了游戲進(jìn)程里面。 所以防止其他程序在游戲目錄中創(chuàng)建相關(guān)文件也是比較重要的。關(guān)于具體的實(shí)現(xiàn)技術(shù)可以采用文件過(guò)濾驅(qū)動(dòng),甚至是Ring3下的全局鉤子。另外,Ppt中提到的輔助方案:“游戲主進(jìn)程檢查自身模塊中除了自身dll模塊以及已簽名文件有沒(méi)其他dll模塊,有則強(qiáng)行卸載”,與剛才說(shuō)的互補(bǔ)的,還是比較有效的。
還有就是保護(hù)自身程序不被修改,因?yàn)楫?dāng)安全軟件越來(lái)越嚴(yán)格,可能盜號(hào)木馬無(wú)路可走時(shí)就以修改你自身的程序?qū)崿F(xiàn)密碼竊取以及自啟動(dòng),所以對(duì)游戲自身的保護(hù)也很重要。
剛才說(shuō)的主動(dòng)防御行為監(jiān)控的方法可以在不需要特征碼的情況下實(shí)現(xiàn)通用的防護(hù),但是和傳統(tǒng)的特征碼的方法相結(jié)合的話,往往可以取得更好的效果。而且自動(dòng)更新也很重要,萬(wàn)一出現(xiàn)一個(gè)從來(lái)沒(méi)有出現(xiàn)過(guò)的比較強(qiáng)的破解方法的話,應(yīng)急小組知道這個(gè)情況,可以立馬對(duì)程序進(jìn)行更新。所以O(shè)ffice文件格式的漏洞為什么比PDF漏洞利用效果好,指的是非0day,因?yàn)镻DF會(huì)強(qiáng)行自動(dòng)更新,Office的是手動(dòng)更新的(正版用戶Office2003以及以后也會(huì)自動(dòng)更新了)。
我們剛才是從游戲開(kāi)發(fā)商的角度講,所以他不可能就像卡巴斯基從安全軟件的角度那樣實(shí)施縱深立體防御,面面俱到。無(wú)論你怎么防,雖然說(shuō)能夠很大程度地防御,但是還是有漏過(guò)的地方。安全防護(hù)和黑客技術(shù)沒(méi)有誰(shuí)最厲害,你這個(gè)安全方案出現(xiàn)的話他完全可以鉆你的空子,尤其做產(chǎn)品不是純粹從技術(shù)角度出發(fā),往往因?yàn)閺某绦虻姆€(wěn)定性以及使用友好型的角度都會(huì)犧牲一些安全強(qiáng)度。 所以很難做到百分之百的安全,所以我們不妨換一角度,找一個(gè)可信基。比如現(xiàn)在因?yàn)槭謾C(jī)的普及,可以將帳號(hào)與手機(jī)關(guān)聯(lián),登錄以及修改密碼時(shí)需要綁定的手機(jī)回復(fù)短信確認(rèn)。有些游戲現(xiàn)在與MAC地址綁定,我認(rèn)為綁定的話最好綁定PC以外的,因?yàn)槟抉R程序已在機(jī)器當(dāng)中,運(yùn)用廣義Hook的這一強(qiáng)大思想機(jī)型偽造,都能搞定。所以我們從另外一個(gè)角度,不應(yīng)綁定pc上的,脫離它,比如和手機(jī)綁定,如果修改密碼的話,它就會(huì)收到一條短消息,如果確認(rèn)修改密碼請(qǐng)回復(fù)Y等類似途徑。對(duì)于虛擬物品的操作發(fā)短信通知用戶并詢問(wèn)。當(dāng)然對(duì)于虛擬物品操作可以嘗試采用T+1方式,預(yù)先登記然后審核確認(rèn)。 再就是動(dòng)態(tài)口令卡,就像工商銀行的網(wǎng)上銀行。還有移動(dòng)證書/Usbkey等。相對(duì)而言比較安全。但對(duì)于動(dòng)態(tài)口令卡以及類似盛大密寶的保護(hù)措施,需要防御我剛才介紹的破解盛大密寶的那種思路。可以和基于主機(jī)的防御方法相結(jié)合。另外動(dòng)態(tài)口令卡算法健壯性和驗(yàn)證服務(wù)器安全性也很重要。
時(shí)間快到了,先談這些,謝謝大家。
|