CTF専用ファイルシステム監視

# - * -コーディング:UTF-8 - * -
#USE:Pythonのfile_check.py ./

インポートOS
インポートhashlib
インポートshutil
インポートntpath
インポート時間

CWD = os.getcwd()
FILE_MD5_DICT} = {#MD5辞書ファイル
ORIGIN_FILE_LIST = []

#特殊ファイルパス文字列
Special_path_str = 'drops_JWI96TY7ZKNMQPDRUOSG0FLH41A3C5EXVB82'
bakstring = 'bak_EAR1IBM0JT9HZ75WU4Y3Q8KLPCX26NDFOGVS'
LogString = 'log_WMY4RVTLAJFB28960SC3KZX7EUP1IHOQN5GD'
webshel​​lstring = 'webshel​​l_WMY4RVTLAJFB28960SC3KZX7EUP1IHOQN5GD'
difffile = 'diff_UMTGPJO17F82K35Z0LEDA6QB9WH4IYRXVSCN'

Special_string = 'drops_log' #Miansijinpai
UNICODE_ENCODING = "UTF-8"
INVALID_UNICODE_CHAR_FORMAT = R&LT "\?%02X "

#パス辞書ファイル
spec_base_path = os.path.realpath(os.path.join(CWD、Special_path_str))
Special_path = {
    'BAK':os.path.realpath(os.path.join(spec_base_path、bakstring))、
    'ログ':OS。 path.realpath(os.path.join(spec_base_path、logstring))、
    'ウェブシェル':os.path.realpath(os.path.join(spec_base_path、webshel​​lstring))、
    'difffile':os.path.realpath(OS。 path.join(spec_base_path、difffile))
}

DEF isListLike(値):
    リターンでisinstance(値、(リスト、タプル、セット))

获取ユニコード编码
DEF getUnicode(値、コード=なし、noneToNull =偽):

    noneToNullもしその値はNoneです:
        リターン・ヌル

    の場合isListLike(値):
        値=(値の_のためgetUnicode(_、エンコード、noneToNull))リスト
        戻り値

    の場合でisinstance(値、ユニコード):
        戻り値
    でisinstanceのelif(値、basestring):
        :真しばらく
            試してみてください。
                戻りユニコード(値、エンコードまたはUNICODE_ENCODING )
            UnicodeDecodeError以外、例:
                トライ:
                    戻りユニコード(値、UNICODE_ENCODING)
                を除く:
                    値=値[:ex.start] + "" .join(INVALID_UNICODE_CHAR_FORMATの%のORD(_)_の値で[ex.start:ex.end ])+値[ex.end:]
    他:
        トライ:
            戻りユニコード(値)
        :UnicodeDecodeError除く
            リターンユニコード(STR(値)、エラー= "無視")

目录创建
デフmkdir_p(パス):
    インポートのerrno
    試し:
        os.makedirs(パス)
    EXCとしてOSErrorのを除い:
        exc.errno == errno.EEXIST場合そしてos.path.isdir(パス):
            渡す
        他:昇給

#获取当前所有文件路径
デフgetfilelist(CWD):
    ファイルリスト= []
    os.walk(CWD)のルートのために、サブディレクトリ、ファイル:
        ファイル内のファイルパスのために:
            originalfile = os.path.join(ルート、ファイルパス)
            Special_path_strない場合originalfileで:
                filelist.append(originalfile)
    戻りファイル一覧

#计算机文件MD5值
デフcalcMD5(ファイルパス):
    試してみる:
        :オープン(ファイルパス、 'RB')をfと
            md5obj = hashlib.md5()
            md5obj.update(f.read())
            ハッシュ= md5obj.hexdigest()
            の戻りハッシュ
    例外、Eを除い:
        '[!] getmd5_error:' Uを印刷+ getUnicode(ファイルパス)
        印刷getUnicode(e)に
        してみてください:
            ORIGIN_FILE_LIST.remove(ファイルパス)
            FILE_MD5_DICT.pop(ファイルパス、なし)
        KeyError例外、Eを除く:
            パス

#获取所有文件MD5
DEF getfilemd5dict(ファイル一覧= []):
    filemd5dict = {}
    ファイル一覧でori_file用:
        Special_path_strないori_fileでIF:
            MD5 = calcMD5(os.path.realpath(ori_file))
            MD5 IF:
                filemd5dict [ori_file] = MD5
    戻りfilemd5dictの

すべてのファイルの#バックアップ
DEF BACKUP_FILE(ファイルリスト= []):
    #lenをIF(os.listdir (Special_path [ 'BAK']))== 0:
    :ファイルリストにファイルパスのための
        ファイルパスにおけるIF Special_path_strなし:
            shutil.copy2(ファイルパス、Special_path [ 'BAK'])

IF __name__ == '__main__':
    Uを印刷「 -スタート------------ ------- "
    Special_pathの値について:
        mkdir_p(Special_path [値])
    #GETすべてのファイルパス、および、すべてのファイルのMD5を取得するすべてのファイルをバックアップ
    ORIGIN_FILE_LIST = getfilelist(CWD)
    FILE_MD5_DICT = getfilemd5dict(ORIGIN_FILE_LIST)
    BACKUP_FILE(ORIGIN_FILE_LIST)#TODO备份文件可能会产生重名BUG
    印刷のu '[*]前の作業終了!'
    :真しばらく
        file_listの= getfilelist(CWD)
        #移除新上传文件
        diff_file_list =リスト(セット(file_listの)^セット(ORIGIN_FILE_LIST))
        :!len の場合(diff_file_list)= 0
            pdb.set_trace();#インポートPDB
            でのファイルパスについてdiff_file_list:
                試してみてください
                    。F =オープン(ファイルパス、R '')(読み)
                例外、Eを除く:
                    ブレーク
                ないFでSpecial_string場合:
                    試してみてください。
                        + getUnicode(ファイルパス):U '[*]を見つけるウェブシェル'印刷
                        shutil.move(ファイルパス、os.path.join(Special_path [ 'ウェブシェル']、ntpath.basename(ファイルパス)+ '.txtファイルを'))
                    のような例外を除きE:
                        Uを印刷'[!]移動ウェブシェルエラー、 "%s"は多分ウェブシェルです。' %getUnicode(ファイルパス)
                    の試行:
                        F =オープン(os.path.join(Special_path [ 'ログ'] 'のlog.txt' )、 '')
                        f.write( 'NEWFILE:' + getUnicode(ファイルパス)+ ':' + strが(time.ctime())+ '\ n')
                        f.close()
                    Eなどの例外を除いて:
                        Uを印刷"[ - ]ログのエラー:ファイルの移動エラー: '+ getUnicode(E)

        #防止任意文件被修改、还原被修改文件
        md5_dict = getfilemd5dict(ORIGIN_FILE_LIST)
        md5_dictでfilekeyのため:
            もしmd5_dict [filekey] = FILE_MD5_DICT [filekey]:!
                試してみてください
                    。F =オープン(filekey、R '')(読み取り)
                例外を除いて、E:
                    ブレークは
                Special_stringがFでない場合:
                    試みは:
                        Uを印刷'[*]ファイルを変更することでした:' + getUnicode(filekey)
                        (Special_path shutil.move(filekey、os.path.join [ 'difffile']、 ntpath.basename(filekey)+ 'の.txt '))
                        shutil.move(os.path.join(Special_path [' BAK']、ntpath.basename(filekey))、filekey)
                    :eと例外を除いて
                        Uを印刷'[!]移動ウェブシェルエラー、 "%s"は多分ウェブシェルです。' %getUnicode(filekey)
                    の試行:
                        F =オープン(os.path.join(Special_path [ 'ログ']、「ログ.TXT ')、 '')
                        f.write(' diff_file: '+ getUnicode(filekey)+' '+ getUnicode(time.ctime())+ '\ n')
                        f.close()
                    Eなどの例外を除い:
                        印刷U '[ - ]ログエラー:done_diff:' + getUnicode(filekey)
                        通過
        time.sleepを(2)
        印刷'[*]' + getUnicode(time.ctime())

おすすめ

転載: www.cnblogs.com/miansj/p/11808973.html