解析映像劫持技術第2/3頁
更新時間:2008年06月26日 22:19:06 作者:
詭異的中毒現(xiàn)象
說白了,IFEO本質(zhì)是系統(tǒng)廠商為某些可能以早期設計模式運行的軟件提供一種保全措施而設計出來的產(chǎn)物,并對其加以擴充形成了一套可用于調(diào)試程序的簡易方案,如“BreakOnDllLoad”參數(shù)可設定在載入某個DLL時設置斷點,便于程序員調(diào)試ISAPI接口;帶有“Range”字樣的幾個參數(shù)則用于限制堆的大小等。
而里面有一個導致了今天這種局面的參數(shù):Debugger?;蛟S微軟當初的用意是便于程序員能夠通過雙擊某個設置了IFEO控制列表的執(zhí)行體文件來直接調(diào)用調(diào)試器對其進行調(diào)試,而不用再通過繁瑣的打開調(diào)試器再進行文件載入來實現(xiàn)調(diào)試,提高了工作效率。
為了使得IFEO能夠影響到任何一個程序啟動請求,NT架構中將IFEO的優(yōu)先權設置得很高,基本上,當用戶要求執(zhí)行某個程序時,系統(tǒng)首先判斷該程序文件是否可執(zhí)行體,然后就到IFEO的入口項進行文件名配對了,直到通過IFEO這一步后,進程才真正開始申請內(nèi)存創(chuàng)建起來。
如果系統(tǒng)在IFEO程序列表里匹配了當前運行的文件名,它就會讀取文件名下的參數(shù),這些參數(shù)在未被人為設置之前均有個默認值,而且它們也具備優(yōu)先權,“Debugger”的優(yōu)先權是最高的,所以它是第一個被讀取的參數(shù),如果該參數(shù)未被設置,則默認不作處理,如果設置了這個參數(shù),情況就變得復雜了……
三. 罪魁禍首“Debugger”
前面一章里大家應該都了解IFEO的本質(zhì)了,從實際現(xiàn)象來說,把IFEO直接稱為“映像劫持”未免有點冤枉它了,因為里面大部分參數(shù)并不會導致今天這種局面的發(fā)生,惹禍的參數(shù)只有一個,那就是“Debugger”,將IFEO視為映像劫持,大概是因為國內(nèi)一些人直接套用了“Image File Execution Options”的縮寫罷,在相對規(guī)范的來自Sysinternals的專業(yè)術語里,利用這個技術的設計漏洞進行非法活動的行為應該被稱為“Image Hijack”,這才是真正字面上的“映像劫持”!
Debugger參數(shù),直接翻譯為“調(diào)試器”,它是IFEO里第一個被處理的參數(shù),其作用是屬于比較匪夷所思的,系統(tǒng)如果發(fā)現(xiàn)某個程序文件在IFEO列表中,它就會首先來讀取Debugger參數(shù),如果該參數(shù)不為空,系統(tǒng)則會把Debugger參數(shù)里指定的程序文件名作為用戶試圖啟動的程序執(zhí)行請求來處理,而僅僅把用戶試圖啟動的程序作為Debugger參數(shù)里指定的程序文件名的參數(shù)發(fā)送過去!光是這個概念大概就足夠一部分人無法理解了,所以我們放簡單點說,例如有兩個客人在一起吃自助餐,其中一個客人(用戶)委托另一個客人(系統(tǒng))去拿食物時順便幫自己帶點食物回來(啟動程序的請求),可是系統(tǒng)在幫用戶裝了一盤子食物并打算回來時卻發(fā)現(xiàn)另一桌上有個客人(Debugger參數(shù)指定的程序文件)居然是自己小學里的暗戀對象!于是系統(tǒng)直接端著原本要拿給用戶的食物放到那桌客人那里共同回憶往事去了(將啟動程序請求的執(zhí)行文件映像名和最初參數(shù)組合轉換成新的命令行參數(shù)……),最終吃到食物的自然就是Debugger客人(獲得命令行參數(shù)),至此系統(tǒng)就忙著執(zhí)行Debugger客人的啟動程序請求而把發(fā)出最初始啟動程序請求的用戶和那盤食物(都送給Debugger客人做命令行參數(shù)了)給遺忘了。
在系統(tǒng)執(zhí)行的邏輯里,這就意味著,當一個設置了IFEO項Debugger參數(shù)指定為“notepad.exe”的“iexplore.exe”被用戶以命令行參數(shù)“-nohome bbs.nettf.net”請求執(zhí)行時,系統(tǒng)實際上到了IFEO那里就跑去執(zhí)行notepad.exe了,而原來收到的執(zhí)行請求的文件名和參數(shù)則被轉化為整個命令行參數(shù)“C:\Program Files\Internet Explorer\IEXPLORE.EXE - nohome bbs.nettf.net”來提交給notepad.exe執(zhí)行,所以最終執(zhí)行的是“notepad.exe C:\Program Files\Internet Explorer\IEXPLORE.EXE - nohome bbs.nettf.net”,即用戶原來要執(zhí)行的程序文件名iexplore.exe被替換為notepad.exe,而原來的整串命令行加上iexplore.exe自身,都被作為新的命令行參數(shù)發(fā)送到notepad.exe去執(zhí)行了,所以用戶最終看到的是記事本的界面,并可能出現(xiàn)兩種情況,一是記事本把整個iexplore.exe都作為文本讀了出來,二是記事本彈出錯誤信息報告“文件名不正確”,這取決于iexplore.exe原來是作為光桿司令狀態(tài)請求執(zhí)行(無附帶運行命令行參數(shù))的還是帶命令行參數(shù)執(zhí)行的。
Debugger參數(shù)存在的本意是為了讓程序員能夠通過雙擊程序文件直接進入調(diào)試器里調(diào)試自己的程序,曾經(jīng)調(diào)試過程序的朋友也許會有一個疑問,既然程序啟動時都要經(jīng)過IFEO這一步,那么在調(diào)試器里點擊啟動剛被Debugger參數(shù)送進來的程序時豈不是又會因為這個法則的存在而導致再次產(chǎn)生一個調(diào)試器進程?微軟并不是傻子,他們理所當然的考慮到了這一點,因此一個程序啟動時是否會調(diào)用到IFEO規(guī)則取決于它是否“從命令行調(diào)用”的,那么“從命令行調(diào)用”該怎么理解呢?例如我們在命令提示符里執(zhí)行taskmgr.exe,這就是一個典型的“從命令行調(diào)用”的執(zhí)行請求,而我們在點擊桌面上、普通應用程序菜單里的taskmgr.exe時,系統(tǒng)都會將其視為由外殼程序Explorer.exe傳遞過來的執(zhí)行請求,這樣一來,它也屬于“從命令行調(diào)用”的范圍而觸發(fā)IFEO規(guī)則了。為了與用戶操作區(qū)分開來,系統(tǒng)自身加載的程序、調(diào)試器里啟動的程序,它們就不屬于“從命令行調(diào)用”的范圍,從而繞開了IFEO,避免了這個加載過程無休止的循環(huán)下去。
從編程角度來說明“命令行調(diào)用”,那就是取決于啟動程序時CreateProcess是使用lpCommandLine(命令行)還是lpApplicationName(程序文件名)來執(zhí)行,默認情況下大部分程序員編寫的調(diào)用習慣是lpCommandLine——命令行調(diào)用
Quote:
BOOL CreateProcess
(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes。
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
由于Debugger參數(shù)的這種特殊作用,它又被稱為“重定向”(Redirection),而利用它進行的攻擊,又被稱為“重定向劫持”(Redirection Hijack),它和“映像劫持”(Image Hijack,或IFEO Hijack)只是稱呼不同,實際上都是一樣的技術手段。
講解完Debugger參數(shù)的作用,現(xiàn)在我們來看看“映像劫持”到底是怎么一回事,遭遇流行“映像劫持”病毒的系統(tǒng)表現(xiàn)為常見的殺毒軟件、防火墻、安全檢測工具等均提示“找不到文件”或執(zhí)行了沒有反應,于是大部分用戶只能去重裝系統(tǒng)了,但是有經(jīng)驗或者歪打正著的用戶將這個程序改了個名字,就發(fā)現(xiàn)它又能正常運行了,這是為什么?答案就是IFEO被人為設置了針對這些流行工具的可執(zhí)行文件名的列表了,而且Debugger參數(shù)指向不存在的文件甚至病毒本身!
以超級巡警的主要執(zhí)行文件AST.exe為例,首先,有個文件名為kkk.exe的惡意程序向IFEO列表里寫入AST.exe項,并設置其Debugger指向kkk.exe,于是系統(tǒng)就會認為kkk.exe是AST.exe的調(diào)試器,這樣每次用戶點擊執(zhí)行AST.exe時,系統(tǒng)執(zhí)行的實際上是作為調(diào)試器身份的kkk.exe,至于本該被執(zhí)行的AST.exe,此刻只能被當作kkk.exe的執(zhí)行參數(shù)來傳遞而已,而由于kkk.exe不是調(diào)試器性質(zhì)的程序,甚至惡意程序作者都沒有編寫執(zhí)行參數(shù)的處理代碼,所以被啟動的永遠只有kkk.exe自己一個,用戶每次點擊那些“打不開”的安全工具,實際上就等于又執(zhí)行了一次惡意程序本體!這個招數(shù)被廣大使用“映像劫持”技術的惡意軟件所青睞,隨著OSO這款超級U盤病毒與AV終結者(隨機數(shù)病毒、8位字母病毒)這兩個滅殺了大部分流行安全工具和殺毒軟件的惡意程序肆虐網(wǎng)絡以后,一時之間全國上下人心惶惶,其實它們最大改進的技術核心就是利用IFEO把自己設置為各種流行安全工具的調(diào)試器罷了,破解之道尤其簡單,只需要將安全工具的執(zhí)行文件隨便改個名字,而這個安全工具又不在乎互斥量的存在,那么它就能正常運行了,除非你運氣太好又改到另一個也處于黑名單內(nèi)的文件名去了,例如把AST.exe改為IceSword.exe。
小知識:互斥量
為了預防用戶簡單的更改一個文件名就使得大部分安全工具破籠而出,一些木馬還同時采用了一種被稱為“互斥量”的技術來徹底阻止安全工具運行。在系統(tǒng)里,有一類特殊的系統(tǒng)對象被稱為“互斥量”(Mutex),它們的存在是為了減少系統(tǒng)開銷而設,例如一些工具在運行時會檢測是否已經(jīng)有另一個自己的副本在運行,要做這種檢測最有效率的方法就是在第一次運行時創(chuàng)建一個互斥量,以后再運行時檢測即可,這實際上是很簡單的方法,因為系統(tǒng)會為我們保存已經(jīng)創(chuàng)建的互斥量,直到程序請求銷毀互斥量,否則它將一直存在。這樣一來,問題又出現(xiàn)了,如果惡意程序掌握了一些安全工具的互斥量并偽造呢?這些安全工具就會因為檢測到“自身已經(jīng)運行”而放棄繼續(xù)執(zhí)行的權利,惡意程序就沒有克星了。
而那些雙擊時明明程序文件就在眼前,系統(tǒng)卻報錯說“找不到文件”,又是什么回事呢?這也是IFEO的另一種應用罷了,其秘訣是將Debugger參數(shù)指向一個不存在的文件位置,這樣系統(tǒng)就會因為找不到這個調(diào)試器而無法順利執(zhí)行下去,如果系統(tǒng)老老實實報出“找不到調(diào)試器”的錯誤提示那倒還好了,但就不知道微軟是出于對IFEO這個東西存在的事實掩蓋還是什么苦衷,卻死活不肯承認是Debugger指向的調(diào)試器不存在導致的錯誤,而是把已經(jīng)被“變異”成為命令行參數(shù)無法進入系統(tǒng)創(chuàng)建進程機制的原執(zhí)行請求作為“找不到的文件”給報了回去,于是未曾了解過IFEO的用戶只能莫名其妙的看著眼前就存在而系統(tǒng)“不承認”的安全工具發(fā)愣了。
相關文章
突破神奇的Cloudflare防火墻的網(wǎng)絡安全學習
這篇文章主要為大家介紹了突破神奇的Cloudflare防火墻的網(wǎng)絡安全學習,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07