日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Python安全運維實戰(zhàn):針對幾種特定隱藏方式的Webshell查殺

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

站在用戶的角度思考問題,與客戶深入溝通,找到通榆網(wǎng)站設計與通榆網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:做網(wǎng)站、成都網(wǎng)站設計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、主機域名、網(wǎng)頁空間、企業(yè)郵箱。業(yè)務覆蓋通榆地區(qū)。

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

一、ntfs交換數(shù)據(jù)流隱藏webshell

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

利用ntfs交換數(shù)據(jù)流隱藏文件的方式很久以前就出現(xiàn)了,介紹利用這種方式來隱藏webshell的文章也不少。這種隱藏方式主要針對一句話木馬,因為如果被包含的文件為大馬則失去了隱藏的意義(若被包含的文件為大馬,會直接跳轉到大馬頁面,原頁面也就相當于被篡改了,很容易就會被發(fā)現(xiàn))。前兩天做了個測試,卻發(fā)現(xiàn)自己手頭經(jīng)常使用的幾個webshell查殺工具居然都檢測不出來,最好的結果只報了一個可疑文件包含,便考慮自己動手寫一寫。

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

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

 
 
 
 
  1. # -*- coding: cp936 -*-
  2. import os,os.path
  3. import re
  4.  
  5. def searchNTFS(catalog):                  #搜索所有ntfs ads文件目錄,返回list
  6.     resultL= []
  7.     forroot,dirs,files in os.walk(catalog):           #利用os.walk()遞歸遍歷文件
  8.         line= ''
  9.        command = 'cd '+ root + '&' + 'dir /r'
  10.         r =os.popen(command)
  11.         info= r.readlines()
  12.         forl in info:
  13.            lineline = line + l
  14.         reN= '\s(\S+)\:\$DATA'
  15.         reres= re.findall(reN,line)
  16.         forre1 in res:
  17.            if re1 != '':
  18.                result = root + '\\' + re1
  19.                resultL.append(result)    
  20.     returnresultL
  21.  
  22. def searchInclude(catalog):    resultL= []
  23.     resultD= {}
  24.     forroot,dirs,files in os.walk(catalog):
  25.         forf in files:
  26.            dir = os.path.join(root,f)
  27.            if dir[-4:] == '.asp':
  28.                try :
  29.                    fp = open(dir,'r')
  30.                    for line in fp.readlines():
  31.                         reN = '<\!--#include\S+="(\S+)"-->'
  32.                         reres = re.findall(reN,line)
  33.                         for re1 in res:
  34.                             if re1 != '':
  35.                                 result = root +'\\' + re1
  36.                                 resultD[result]= root + '\\' +f
  37.                except:
  38.                    print "File :" + dir + " can't be read"
  39.     returnresultD
  40.  
  41. if __name__ == "__main__":
  42.     reD =searchInclude('C:\inetpub\wwwroot')
  43.     reN =list(set(reD.keys()).intersection(set(searchNTFS('C:\inetpub\wwwroot'))))
  44.     reI = []
  45.     for re1in reN:
  46.        reI.append(reD[re1])
  47.     if reI!= []:
  48.         forre2 in reN :
  49.            print '###############################################################'
  50.            print "[+]Suspicious ADS files found : " + re2
  51.         for re3 in reI :
  52.            print '###############################################################'
  53.            print "[+]Including files: " + re3 + "  \n Please check it."
  54.     else :
  55.        print "[+]No suspicious ADS files found."

二、畸形文件名、保留文件名隱藏webshell

簡單科普下,windows的畸形目錄名有很多種,通常是指文件名中存在多個.號,例如\a…\,圖形界面下無法訪問和刪除,命令行界面也只能通過windows的短文件名進行訪問。

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

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

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

 
 
 
 
  1. # -*- coding: cp936 -*-
  2. import os,os.path
  3. import re
  4.  
  5. def searchSFN(catalog):
  6.     resultL = []
  7.     resultL2 = []
  8.     for root,dirs,files in os.walk(catalog):            #利用os.walk()遞歸遍歷文件
  9.         line = ''
  10.         command = 'cd '+ root + '&' + 'dir/x'
  11.         r = os.popen(command)
  12.         info = r.readlines()
  13.         for l in info:
  14.             lineline = line + l
  15.         reN1 = '\s+(\S+\~\S+)\s+\S+\.\.+'
  16.         reres = re.findall(reN1,line)
  17.         for re1 in res:
  18.             if re1 != '':
  19.                 result = '\\\\.\\' + root + '\\'+ re1
  20.                 resultL.append(result)
  21.        
  22.  reN2 
  23. ='\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+'
  24.         reres2 = re.findall(reN2,line)
  25.         for re2 in res2:
  26.             if re2 != '':
  27.                 result2 = '\\\\.\\' + root +'\\' + re2[0]
  28.                 resultL2.append(result2)
  29.     return resultL,resultL2
  30.  
  31. defdeleteSFN(list,list2):
  32.     for l1 in list :
  33.         str = raw_input('Do you want to delete: ' + l1 + '? (y/n)')
  34.         if str == 'y' :
  35.             command = 'rd /s /q ' + l1
  36.             r = os.popen(command)
  37.         else :
  38.             pass
  39.     for l2 in list2 :
  40.         str = raw_input('Do you want to delete: ' + l2 + '? (y/n)')
  41.         if str == 'y' :
  42.             command = 'del /f /q /a ' + l2
  43.             r = os.popen(command)
  44.         else :
  45.             pass
  46.  
  47. if __name__ =="__main__":
  48.     list,list1 =searchSFN('C:\inetpub\wwwroot')
  49.     deleteSFN(list,list1)

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

三、驅動隱藏webshell(Easy File Locker)

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

 
 
 
 
  1. # -*- coding: cp936 -*-
  2. import os,os.path
  3. import re
  4.  
  5. def searchEFL():
  6.     line = ''
  7.     command1 = 'sc qc xlkfs'         #插看是否存在xlkfs服務,返回1060則判定不存在
  8.     command2 = 'net stop xlkfs' + '&' + 'sc delete xlkfs'      #停止并刪除服務
  9.     r =os.popen(command1)
  10.     info = r.readlines()
  11.     for l in info:
  12.         lineline = line+ l
  13.     if"1060" in line:
  14.         print'[+]No XLKFS service found.'
  15.     else :
  16.         r =os.popen(command2)
  17.         print'[+]XLKFS service found. Has been cleared.'
  18.  
  19. if __name__ == "__main__":
  20.     searchEFL()

四、總結

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

(以上實驗環(huán)境基于windows server 2008r2 standard,iis 7.0)


分享題目:Python安全運維實戰(zhàn):針對幾種特定隱藏方式的Webshell查殺
鏈接分享:http://m.5511xx.com/article/dhjopgd.html