查找phpwebshell的Python脚本


查找phpwebshell小工具

思路就是对比脚本文件以及配置文件的hash,找出hash改变的脚本或者配置文件,脚本共三个参数:

1,-save 即读取web目录和配置文件,计算文件的hash值并且批量保存为文件;

2,-find 即通过保存的hash值列表文件与当前web目录脚本文件和配置文件hash进行比较,找出hash变动的文件;

3,-listen 首先执行save。然后循环执行find,如果发现hash异常通过email通知管理员。每次find完成后都sleep一段时间,这里默认半个小时,相当于半个小时检查一次。

import hashlib
import sys
import os
import re
import time
import smtplib
from email.mime.text import MIMEText

def send_mail(content):
    to_list=["[email protected]"]
    mail_host="smtp.163.com"
    mail_user="xxxx"
    mail_pass="xxxr"
    mail_postfix="163.com"
    me=mail_user+"<"+mail_user+"@"+mail_postfix+">"
    msg = MIMEText(content)
    msg['Subject'] ='warning'
    msg['From'] = me
    msg['To'] = ";".join(to_list)
    try:
        s = smtplib.SMTP()
        s.connect(mail_host)
        s.login(mail_user,mail_pass)
        s.sendmail(me, to_list, msg.as_string())
        s.close()
        return True
    except Exception, e:
        print str(e)
        return False

def md5Checksum(filePath):
        fh = open(filePath, 'rb')
        m = hashlib.md5()
        while True:
            data = fh.read(8192)
            if not data:
                break
            m.update(data)
        fh.close()
        return m.hexdigest()
def load_hash(filepath):
        pass
def load_filelist(f):
        f1=open(f,'r')
        f_list=[]
        while 1:
            line=f1.readline()
            if not line:
                break
            f_list.append(line)
        dic={}
        for str1 in f_list:
            item1,item2= str1.split(':')
            dic[item1]=item2
        f1.close()
        return dic

def save_config(configpath,webdir):
        f1=open('config','w')
        f1.writelines('configpath:'+configpath+'rn')
        f1.writelines('webdir:'+webdir+'rn')
        f1.close()
def find():
        lists=[]
        lists=findchange()
        for str1 in lists:
           print str1
def findchange():
        relist=[]
        dic1={}
        dic1= load_filelist('save_hash')
        dic2={}
        dic2=load_filelist('config')
        weblist=[]
        weblist=load_all_path(dic2['webdir'].replace('rn',''))
        weblist.append(str(dic2['configpath'].replace('rn','')))
        for webpage in weblist:
           if str(dic1.get(webpage))=='None':
               relist.append(webpage+' is new filern')
           elif str(dic1.get(webpage)).replace('rn','')!=md5Checksum(webpage):
              relist.append(webpage+'   has been changedrn')
        return relist
def load_all_path(rootDir):
    str1=[]
    list_dirs = os.walk(rootDir)
    for root, dirs, files in list_dirs:
        for f in files:
               if  str(os.path.splitext(f)[1])=='.php' or str(os.path.splitext(f)[0])=='.htaccess':
                   str1.append(str(os.path.join(root, f)))
    return str1
def save(config,webpath):
    save_config(config,webpath)
    confighash=md5Checksum(config)
    weblist=[]
    weblist=load_all_path(webpath)
    print weblist
    f1=open('save_hash','w')
    f1.writelines(config+':'+confighash+"rn")
    for str1 in weblist:
        print str1
        f1.writelines(str1+':'+md5Checksum(str1)+"rn")
    f1.close()
def listen(config,webpath):
    save(config,webpath)
    while 1:
        lists=[]
        lists=findchange()
        if(len(lists)!=0):
           str2=''
           for str1 in lists:
               str2=str2+str1.replace('rn','')+'n'
           send_mail(str2)
        time.sleep(3600)

if __name__ == '__main__':
    banner='''usage:
    find.py -save config webpath
    find.py -find
    nohup python  find.py -listen config webpath $
    Example:
    python find.py -save /etc/apache2/apache2.conf /var/www
    python find.py -find
    nohup python find.py -listen /etc/apache2/apache2.conf /var/www &
    email:[email protected]
    '''

    if (len(sys.argv)<2):
        print banner
    elif (len(sys.argv)==4 and sys.argv[1]=='-save'):
        save(sys.argv[2],sys.argv[3])
    elif (len(sys.argv)==2 and sys.argv[1]=='-find'):
        find()
    elif (sys.argv[1]=='-listen'):
         listen(sys.argv[2],sys.argv[3])
    else :
        print banner

 

====在上面的代码中已解决====
脚本存在两个问题:
1.在第一次使用该脚本时,是不一定存在config文件的,而代码中直接使用open(filePath, ‘rb’)方式读取,在使用”-save”选项时会报错{IOError: [Errno 2] No such file or directory: ‘D:temp_configure.conf’}(补充:之前是自己理解错误,这里的配置文件是指需要被监控的配置文件,所以肯定是存在的,不过如果能在代码中加入容错语句肯定是最好不过的
2.自己在新建了配置文件(内容可为空)之后,执行”-find”选项后,因为代码中的load_filelist()函数,是通过split(‘:’)来读取的文件名和Hash值,但是,在Windows中,路径中始终都会存在一个盘符后面跟着’:’因此会导致错误,比较好的解决办法(我觉得应该是以”#”来分隔要好些,或者是’t’){ValueError: too many values to unpack}
代码来源查找phpwebshell小工具
, ,

《“查找phpwebshell的Python脚本”》 有 8 条评论

  1. 深度学习PHP webshell查杀引擎demo
    https://www.cdxy.me/?p=788
    `
    传统webshell查杀思路
      规则系统
      旁路执行
      沙箱

    基于机器学习/深度学习的webshell查杀引擎,通过专家知识提取特征训练分类器,其结果受样本、特征、结构等多种因素影响。特征维度:
      文本语义(n-gram/TF-IDF/word2vec/CNN/RNN)
      统计特征(信息熵/重合指数/最长词/可压缩比)
      历史数据特征(计算单个文件的落盘时间/文件创建进程/文件类型/代码风格/权限和同目录下其他文件的”距离”)
      OP指令层特征(指令/调用链/参数文本特征)
      动态特征(文件读写/网络连接,可依靠沙箱或旁路执行能力解决编码混淆类case)
    `

  2. PHP 一句话木马检测绕过研究
    https://mp.weixin.qq.com/s/LytVSOt81UpRyetMh6twnw
    `
    本篇文章主要探讨关于 PHP 语言的 Webshell 检测工具和平台的绕过方法,实现能够绕过以下表格中 7 个主流(基本代表安全行业内 PHP Webshell检测的一流水平)专业工具和平台检测的 PHP Webshell,构造出零提示、无警告、无法被检测到的一句话木马后门。
    `
    1、网站安全狗网马查杀
    http://download.safedog.cn/download/software/safedogwzApache.exe
    2、D盾 Web 查杀
    http://www.d99net.net/down/WebShellKill_V2.0.9.zip
    3、深信服WebShellKillerTool
    http://edr.sangfor.com.cn/tool/WebShellKillerTool.zip
    4、BugScaner killwebshell
    http://tools.bugscaner.com/killwebshell/
    5、河马专业版查杀Webshell
    http://n.shellpub.com/
    6、OpenRASP WEBDIR+ 检测引擎
    https://scanner.baidu.com
    7、深度学习模型检测 PHP Webshell
    http://webshell.cdxy.me/

  3. 牧云(CloudWalker)开源手记 | Webshell 监控检测策略初探
    https://mp.weixin.qq.com/s/7TuUqdleZc5xbZG5Xh3f3Q
    `
    目前大多 Webshell 检测存在检测维度单一,检测时间较长,检测手段需要执行入侵等产品策略问题,某些知名 Webshell 检测产品的召回率也远不能达到实际需求的效果,牧云Webshell 监控检测针对这些做了改进,尝试呈现全新的技术解决方案。

    在检测维度上,牧云采用样本模糊匹配、统计特征检测、AST 语法检测、正则补充检测的多维度检测方案。
    检测过程完全在主机进行,无网络传输和云端请求的时间成本。
    检测方案覆盖了非入侵式检测中绝大多数可以使用的数据模型。
    检测过程无代码执行,避免沙箱逃逸,也无需更改原有服务架构和路由策略,使得配置更为方便。
    `

  4. 利用机器学习算法识别WebShell(Machine Learning Recognition of WebShell)
    https://paper.tuisec.win/detail/b9fda80d89e84bd
    https://www.anquanke.com/post/id/176645
    `
    预处理
      将文件夹中的图像,js脚本,css样式筛选出去
      将文件统一编码为utf-8
      对列表中的文件进行去重
      将不在列表中的文件从buf中移除
      创建文件预处理流水线对文件进行处理
    创建特征
      统计文章长度
      计算文章的熵值
      统计文章最长的单词
      统计文章中恶意词汇的数量
      计算文章的可压缩比例
      将特征提取过程打包
    处理数据
      将数据从文件夹读取出来
      创建标签
      计算各个文件的特征值
      将特征集合在一起,生成一个DataFrame
      查看前五条数据
      查看数据的整体状况
      查看数据中两种数据所占比例
      有三个特征格式不正确,进行转换
    分析数据
      五个特征对于两类文件的平均值
      导入画图的库
      将各个特征以图形化的界面展现出来
      计算出各个参数之间的皮尔逊系数
      按shell占比例将数据均匀分开
      将X,Y分离
      载入性能考核函数,并对结果进行评定
    分类算法介绍
      最有影响力的十大数据挖掘算法中包含的分类算法
      k近邻算法
      SVM法
      决策树
      朴素贝叶斯
      神经网络
      逻辑回归
      随机森林
      adaboost
      xgboost
      gbdt+lr
    分类算法尝试
      K近邻法
      支持向量机
      决策树
      朴素贝叶斯分类
      随机森林
      ADABOOST
      XGBOOST
      GBDT+LR
      投票算法
    对随机森林进行参数优化测试
      Estimators参数调整
      features参数调整
    尾声
      确定最终模型并将训练结果存储起来
      读取模型的方法
    `

  5. 10款常见的Webshell检测工具
    https://mp.weixin.qq.com/s/J-oV_gc9h9XLZQiY_iFNzg
    `
    本文推荐了10款Webshll检测工具,用于网站入侵排查。当然,目前市场上的很多主机安全产品也都提供这种WebShell检测能力,比如阿里云、青藤云、safedog等,本文暂不讨论。

    1、D盾_Web查杀
    2、百度WEBDIR+
    3、河马
    4、Web Shell Detector
    4、Web Shell Detector
    6、Sangfor WebShellKill
    7、深度学习模型检测PHP Webshell
    8、PHP Malware Finder
    9、findWebshell
    10、在线webshell查杀工具
    `

发表评论

您的电子邮箱地址不会被公开。