亚洲熟女综合色一区二区三区,亚洲精品中文字幕无码蜜桃,亚洲va欧美va日韩va成人网,亚洲av无码国产一区二区三区,亚洲精品无码久久久久久久

Python安全運(yùn)維實(shí)戰(zhàn):針對(duì)幾種特定隱藏方式的Webshell查殺

Webshell一直都是網(wǎng)站管理員痛恨看到的東西,一旦在網(wǎng)站目錄里看到了陌生的webshell基本說(shuō)明網(wǎng)站已經(jīng)被攻擊者拿下了。站在攻擊者的角度,要想滲透一臺(tái)網(wǎng)站服務(wù)器,第一個(gè)目標(biāo)也是想方設(shè)法的尋找漏洞上傳webshell。

對(duì)于webshell的防護(hù)通?;趦牲c(diǎn):一是在攻擊者上傳和訪問(wèn)時(shí)通過(guò)特征匹配進(jìn)行檢測(cè)攔截或限制文件類(lèi)型阻止上傳;二就是日?;趙ebshell文件特征的靜態(tài)查殺(也有基于日志的,在這里不做討論)。第一種方法不是我們今天要討論的,waf、安全狗等一系列工具可以實(shí)現(xiàn)相應(yīng)的功能。第二種方式靜態(tài)查殺,通常會(huì)匹配一些關(guān)鍵字、危險(xiǎn)函數(shù)、一些特征代碼及他們的各種加密形式,以遍歷文件的方式來(lái)進(jìn)行查殺。然而還有很多種通過(guò)破壞遍歷規(guī)則(使惡意文件無(wú)法被遍歷到)的隱藏方式,通常可以達(dá)到避免被查殺的目的。今天我們要說(shuō)的就是: ? ?如何利用Python實(shí)現(xiàn)針對(duì)這幾種特定隱藏方式的webshell查殺。

0X01 ntfs交換數(shù)據(jù)流隱藏webshell

NTFS交換數(shù)據(jù)流(alternate data streams,簡(jiǎn)稱(chēng)ADS)是NTFS磁盤(pán)格式的一個(gè)特性,在NTFS文件系統(tǒng)下,每個(gè)文件都可以存在多個(gè)數(shù)據(jù)流,就是說(shuō)除了主文件流之外還可以有許多非主文件流寄宿在主文件流中。它使用資源派生來(lái)維持與文件相關(guān)的信息,雖然我們無(wú)法看到數(shù)據(jù)流文件,但是它卻是真實(shí)存在于我們的系統(tǒng)中的。

利用ntfs交換數(shù)據(jù)流隱藏文件的方式很久以前就出現(xiàn)了,介紹利用這種方式來(lái)隱藏webshell的文章也不少。這種隱藏方式主要針對(duì)一句話木馬,因?yàn)槿绻话奈募榇篑R則失去了隱藏的意義(若被包含的文件為大馬,會(huì)直接跳轉(zhuǎn)到大馬頁(yè)面,原頁(yè)面也就相當(dāng)于被篡改了,很容易就會(huì)被發(fā)現(xiàn))。前兩天做了個(gè)測(cè)試,卻發(fā)現(xiàn)自己手頭經(jīng)常使用的幾個(gè)webshell查殺工具居然都檢測(cè)不出來(lái),最好的結(jié)果只報(bào)了一個(gè)可疑文件包含,便考慮自己動(dòng)手寫(xiě)一寫(xiě)。

整體邏輯很簡(jiǎn)單,首先遍歷web應(yīng)用所在的文件夾,找出所有利用ntfs交換數(shù)據(jù)流隱藏的文件,組成一個(gè)list;其次遍歷所有.asp文件(以asp為例),找出所有采用了包含頭的.asp文件,將其路徑作為value,將被包含的文件路徑作為key,建立一個(gè)dict。與之前的list做對(duì)比,若在dict中發(fā)現(xiàn)了存在于list中的元素,則斷定它為webshell,最后將其路徑輸出,并同時(shí)將包含它的.asp文件路徑輸出。說(shuō)白了就是以這個(gè)包含了ntfs交換數(shù)據(jù)流文件的動(dòng)作來(lái)斷定它是否為webshell。

使用到的windows命令:dir /r ????#顯示文件的備用數(shù)據(jù)流

Python安全運(yùn)維實(shí)戰(zhàn):針對(duì)幾種特定隱藏方式的Webshell查殺

# -*- coding: cp936 -*-importos,os.pathimportre ?defsearchNTFS(catalog):?????????????????#搜索所有ntfs ads文件目錄,返回list??? resultL= [] ??? forroot,dirs,filesinos.walk(catalog):???????????#利用os.walk()遞歸遍歷文件??????? line=&apos;&apos;???????command =&apos;cd &apos;+ root +&apos;&&apos;+&apos;dir /r&apos;??????? r =os.popen(command) ??????? info= r.readlines() ??????? forlininfo: ???????????line = line + l ??????? reN=&apos;\s(\S+)\:\$DATA&apos;??????? res= re.findall(reN,line) ??????? forre1inres: ???????????ifre1 !=&apos;&apos;: ???????????????result = root +&apos;\\&apos;+ re1 ???????????????resultL.append(result)??? ??? returnresultL ?defsearchInclude(catalog):??? resultL= [] ??? resultD= {} ??? forroot,dirs,filesinos.walk(catalog): ??????? forfinfiles: ???????????dir = os.path.join(root,f) ???????????ifdir[-4:] ==&apos;.asp&apos;: ???????????????try: ???????????????????fp = open(dir,&apos;r&apos;) ???????????????????forlineinfp.readlines(): ??????????????????????? reN =&apos;<\!--#include\S+="(\S+)"-->&apos;??????????????????????? res = re.findall(reN,line) ???????????????????????forre1inres: ???????????????????????????ifre1 !=&apos;&apos;: ??????????????????????????????? result = root +&apos;\\&apos;+ re1 ??????????????????????????????? resultD[result]= root +&apos;\\&apos;+f ???????????????except: ???????????????????print"File :"+ dir +" can&apos;t be read"??? returnresultD ?if__name__ =="__main__": ??? reD =searchInclude(&apos;C:\inetpub\wwwroot&apos;) ??? reN =list(set(reD.keys()).intersection(set(searchNTFS(&apos;C:\inetpub\wwwroot&apos;)))) ??? reI = [] ???forre1in reN: ???????reI.append(reD[re1]) ???ifreI!= []: ??????? forre2inreN : ???????????print&apos;###############################################################&apos;???????????print"[+]Suspicious ADS files found : "+ re2 ?? ?????forre3inreI : ???????????print&apos;###############################################################&apos;???????????print"[+]Including files: "+ re3 +"? \n Please check it."???else: ???????print"[+]No suspicious ADS files found."

0X02 畸形文件名、保留文件名隱藏webshell

簡(jiǎn)單科普下,windows的畸形目錄名有很多種,通常是指文件名中存在多個(gè).號(hào),例如\a…\,圖形界面下無(wú)法訪問(wèn)和刪除,命令行界面也只能通過(guò)windows的短文件名進(jìn)行訪問(wèn)。

Windows的保留文件名,例如aux、prn、con、nul、com1~9、lpt1~9等等,windows不允許用戶(hù)以常規(guī)方式自行創(chuàng)建,但可以通過(guò)copy或者echo等命令加上網(wǎng)絡(luò)位置\\.\來(lái)創(chuàng)建,訪問(wèn)也要在絕對(duì)路徑前加上\\.\來(lái)訪問(wèn)(例如type\\.\C:\inetpub\wwwroot\aux.asp)。

利用的時(shí)候可以單種使用也可以一起使用,例如C:\inetpub\wwwroot\a…\aux.asp

我們需要用到命令:dir /x?? #顯示為非 8.3 文件名產(chǎn)生的短名稱(chēng)

Python安全運(yùn)維實(shí)戰(zhàn):針對(duì)幾種特定隱藏方式的Webshell查殺

# -*- coding: cp936 -*-importos,os.pathimportre ?defsearchSFN(catalog):??? resultL = [] ??? resultL2 = [] ???forroot,dirs,filesinos.walk(catalog):???????????#利用os.walk()遞歸遍歷文件??????? line =&apos;&apos;??????? command =&apos;cd &apos;+ root +&apos;&&apos;+&apos;dir/x&apos;??????? r = os.popen(command) ??????? info = r.readlines() ???????forlininfo: ??????????? line = line + l ??????? reN1 =&apos;\s+(\S+\~\S+)\s+\S+\.\.+&apos;??????? res = re.findall(reN1,line) ???????forre1inres: ???????????ifre1 !=&apos;&apos;: ??????????????? result =&apos;\\\\.\\&apos;+ root +&apos;\\&apos;+ re1 ??????????????? resultL.append(result) ??????? reN2 =&apos;\s+((aux|prn|con|nul|com1|com2|com3|com4|com5|com6|com7|com8|com9|lpt1|lpt2|lpt3|lpt4|lpt5|lpt6|lpt7|lpt8|lpt)\.\S+)\s+&apos;??????? res2 = re.findall(reN2,line) ???????forre2inres2: ???????????ifre2 !=&apos;&apos;: ??????????????? result2 =&apos;\\\\.\\&apos;+ root +&apos;\\&apos;+ re2[0] ??????????????? resultL2.append(result2) ???returnresultL,resultL2 ? defdeleteSFN(list,list2): ???forl1inlist : ??????? str = raw_input(&apos;Do you want to delete: &apos;+ l1 +&apos;? (y/n)&apos;) ???????ifstr ==&apos;y&apos;: ??????????? command =&apos;rd /s /q &apos;+ l1 ??????????? r = os.popen(command) ???????else: ???????????pass???forl2inlist2 : ??????? str = raw_input(&apos;Do you want to delete: &apos;+ l2 +&apos;? (y/n)&apos;) ???????ifstr ==&apos;y&apos;: ??????????? command =&apos;del /f /q /a &apos;+ l2 ??????????? r = os.popen(command) ???????else: ???????????pass?if__name__ =="__main__": ??? list,list1 =searchSFN(&apos;C:\inetpub\wwwroot&apos;) ??? deleteSFN(list,list1)

這里提供了兩個(gè)函數(shù),searchSFN()找出應(yīng)用目錄中所有畸形目錄名對(duì)應(yīng)的短文件名和所有windows保留文件名,返回兩個(gè)目錄列表,deleteSFN()決定是否刪除他們。

0X03 驅(qū)動(dòng)隱藏webshell(Easy File Locker)

驅(qū)動(dòng)隱藏的原理是在windows的指針遍歷到一個(gè)文件夾的時(shí),增加一個(gè)文件夾大小的偏移量,直接跳過(guò)文件夾,從而達(dá)到隱藏的目的?,F(xiàn)在最常見(jiàn)到的驅(qū)動(dòng)隱藏通常是借助第三方軟件Easy File Locker實(shí)現(xiàn)的,幾年前也就存在了,但是說(shuō)說(shuō)我自己測(cè)試的結(jié)果吧,手頭的webshell查殺工具全軍覆沒(méi),沒(méi)有一個(gè)能反映出一點(diǎn)痕跡的。簡(jiǎn)單寫(xiě)了個(gè)函數(shù)用于查看是否存在Easy File Locker的服務(wù)并刪除。利用了windows下的sc qc xlkfs、net stop xlkfs和sc delete xlkfs三條命令,xlkfs是Easy File Locker的服務(wù)名。(這里寫(xiě)成腳本模式是為了方便后續(xù)寫(xiě)成插件加入傳統(tǒng)查殺工具,否則直接使用命令即可)

 

# -*- coding: cp936 -*-importos,os.pathimportre ?defsearchEFL():??? line =&apos;&apos;??? command1 =&apos;sc qc xlkfs&apos;? ? ? ? #插看是否存在xlkfs服務(wù),返回1060則判定不存在 ??? command2 =&apos;net stop xlkfs&apos;+&apos;&&apos;+&apos;sc delete xlkfs&apos;? ? ?#停止并刪除服務(wù) ??? r =os.popen(command1) ??? info = r.readlines() ???forlininfo: ??????? line = line+ l ???if"1060"inline: ???????print&apos;[+]No XLKFS service found.&apos;???else: ??????? r =os.popen(command2) ???????print&apos;[+]XLKFS service found. Has been cleared.&apos;?if__name__ =="__main__": ??? searchEFL()

0X04 總結(jié)

對(duì)于這幾種通過(guò)破壞遍歷規(guī)則的隱藏方式,其實(shí)都可以從其隱藏的動(dòng)作直接判定它就是不懷好意的文件,不然為什么要做賊心虛的隱藏呢?但更可靠的方式就是先恢復(fù)遍歷,讓被隱藏的文件都能夠被遍歷到,然后再對(duì)文件進(jìn)行常規(guī)的查殺。第一部分和第二部分提供的函數(shù)的最終目的都是為了最后提供對(duì)應(yīng)的可訪問(wèn)的目錄名列表,第三部分停止并刪除了Easy File Locker的服務(wù),文件自然就恢復(fù)了可遍歷性。這里提供的函數(shù)單獨(dú)也可以使用,但更推薦的做法是將其寫(xiě)成插件的形式加入傳統(tǒng)查殺的工具中,使文件能夠被遍歷后,再對(duì)文件進(jìn)行常規(guī)查殺規(guī)則的匹配。Github上有很多Python的webshell查殺項(xiàng)目,匹配的一些特征庫(kù)什么的已經(jīng)很全了,寫(xiě)成插件加入后親測(cè)效果不錯(cuò),大家有興趣可以自己動(dòng)動(dòng)手去實(shí)現(xiàn)。

相關(guān)新聞

歷經(jīng)多年發(fā)展,已成為國(guó)內(nèi)好評(píng)如潮的Linux云計(jì)算運(yùn)維、SRE、Devops、網(wǎng)絡(luò)安全、云原生、Go、Python開(kāi)發(fā)專(zhuān)業(yè)人才培訓(xùn)機(jī)構(gòu)!