第三篇—基于黑白样本的webshell检测

  本篇为webshell检测的第三篇,主要讲的是基于黑白样本的webshell预测,从样本收集、特征提取、模型训练,最后模型评估这四步,实现一个简单的黑白样本预测模型。
  若有误之处,望大佬们指出

Ⅰ 基本实现步骤

  1. 样本收集:首先,你需要收集大量的黑样本(恶意的webshell)和白样本(正常的web文件)。这些样本将用于训练和测试你的检测模型。
  2. 特征提取:对于每一个样本,你需要提取出对于webshell检测有用的特征。这些特征可能包括文件的大小、文件的修改时间、文件中包含的特定字符串等等。
  3. 模型训练:使用你收集的样本和提取的特征,你可以训练一个机器学习模型来进行webshell检测。这个模型可能是一个决策树、随机森林、支持向量机、神经网络等等。
  4. 模型评估:在模型训练完成后,你需要对模型的性能进行评估。这通常包括计算模型的准确率、召回率、F1值等指标。

关于样本收集过程,需要注意的地方

  • 选取合适的正常样本和恶意样本进行降噪、向量化与随机抽样
  • 其优点是具备不错的未知威胁检测能力,其缺点是对样本要求较高。

Ⅱ 样本收集

黑样本
  直接搜github,搜集近2000+webshell文件,进行数据清洗,最后只得到了525个php的webshell,样本有点少了

白样本
  常见的CMS框架:WP、帝国、极致、TP等等
注意:在这里,收集的白样本,小版本迭代的CMS可以不收集,里面存在大量的重复,我是直接收集大版本的源码
下面是我收集的白样本以及下载地址,近4w个左右
[图片]

  • https://github.com/phpmyadmin/phpmyadmin/tree/MAINT_4_0_10
  • https://github.com/smarty-php/smarty/tree/v2.6.32
  • https://github.com/yiisoft/yii2/tree/2.0.32

接下来就是——样本清洗
白样本清洗大致思路

  1. 删除无关文件:你可以删除那些与webshell检测无关的文件,例如图片、音频、视频等非代码文件。
  2. 删除重复文件:如果你的白样本中存在大量的重复文件,那么这些文件可能会对你的模型产生过拟合的影响。因此,你需要删除这些重复的文件。
  3. 代码格式化:为了使得你的模型能够更好地理解代码的结构,你可以对代码进行格式化,例如删除多余的空格和注释,统一代码的缩进和换行等。
  4. 提取代码特征:你可以提取代码的一些特征,例如函数的数量、变量的数量、代码的长度等,这些特征可以帮助你的模型更好地理解代码。
  5. 标记样本:为了训练你的模型,你需要给你的白样本打上标签,表示这些样本是正常的web文件。
    在这里插入图片描述

  黑样本清洗大致思路,样本有点少,清洗流程主要都是去空格、去注释、去重、去空白文件。

Ⅲ 特征提取

通过两种方式:词袋模型或者opcode模型训练,再配合上TF-IDF

TF-IDF是啥?
  这是一种统计方法,用来评估一个词对于一个文件集或语料库中的其中一份文件的重要程度,字词的重要性随着它在文件中出现的次数成正比增加, 但是同时也会随着它在语料库中出现的频率成反比下降。

  1. 词袋模型 + TF-IDF模型训练
    基本流程
  • 合并黑白样本
  • 计算TF-IDF值,并保存模型

    def calculate_tfidf(self):
        # 合并黑样本和白样本
        samples = self.black_samples + self.white_samples
        # 计算TF-IDF值
        vectorizer = TfidfVectorizer(max_features=1000)
        self.features = vectorizer.fit_transform(samples)
        # 保存TF-IDF值模型
        joblib.dump(vectorizer, os.path.join(self.config_dir, "tfidf_model.pkl"))
        # 为黑样本和白样本生成标签
        self.labels = [1]*len(self.black_samples) + [0]*len(self.white_samples)
        # 保存特征和标签
        np.savez(os.path.join(self.config_dir, 'features_labels.npz'), features=self.features.toarray(), labels=self.labels)
        print(f"有效的样本总数:{len(samples)}")

最终需要形成一个特征文件,作为后续预测使用
采用词袋模型算法,计算出的样本数量 1w个
[图片]

【留下疑问】

  • 这个特征文件有什么用
  • 最后需要怎么进行评分模型处理
  • 如何提高一个预测的正确率

Ⅳ 预测模型生成

  拿到这个特征文件后,需要将黑样本标记为1,白样本标记为0,然后用以下算法,生成预测模型

  • 第一种是朴素贝叶斯算法,
  • 第二种是随机森林

用python写了两个算法的实现逻辑
【随机森林实现】

# 加载特征和标签
data = np.load('config/features_labels.npz')
features = data['features']
labels = data['labels']

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42)

# 输出矩阵数量
print(f"训练集的矩阵形状:{X_train.shape}")
print(f"测试集的矩阵形状:{X_test.shape}")
# 创建并训练随机森林模型
clf = RandomForestClassifier(n_estimators=100, random_state=42)
clf.fit(X_train, y_train)

# 保存随机森林预测模型
joblib.dump(clf, "config/rf_model.pkl")
# 预测测试集
y_pred = clf.predict(X_test)

# 计算并打印检出率(召回率)和精确率
recall = recall_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)

朴素贝叶斯生成预测模型

data = np.load('config/features_labels.npz')
features = data['features']
labels = data['labels']

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(features, labels, test_size=0.2, random_state=42)

# 输出训练集和测试集的矩阵形状
print(f"训练集的矩阵形状:{X_train.shape}")
print(f"测试集的矩阵形状:{X_test.shape}")

# 创建并训练朴素贝叶斯模型
clf = MultinomialNB()
clf.fit(X_train, y_train)

# 预测测试集
y_pred = clf.predict(X_test)

# 计算并打印检出率(召回率)和精确率
recall = recall_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)

以下是其预测结果
[图片]

Ⅴ 实战预测

利用训练好的模型,进行预测处理

    # 词袋模型
    tfidf_model = joblib.load('config/tfidf_model.pkl')
    # 随机森林预测模型
    rf_model = joblib.load('config/rf_model.pkl')
    # 预处理代码
    with open(file_path, 'r', errors='ignore') as f:
        code = f.read()
    code = preprocess_code(code)
    # 提取特征
    features = tfidf_model.transform([code])

    # 预测
    pred = rf_model.predict(features)

[图片]

效果没预期的那么好
这里会有一个问题,如果内容上不是携带有php文件的标签的,如"<?php>",就会默认评判会webshell
如下面所示
在这里插入图片描述

在这里插入图片描述

效果很一般,需要调整下

  • 使用MLP算法,特征提取使用词袋&TF-IDF模型
  • 特征提取使用opcode&n-gram,降低样本的噪点

  十分感谢能看到这里,这个预测还有好多好多需要完善的,貌似只使用一种方式,效果都是很一般的,下版本试一下优化下,尽可能是降低黑白样本噪点 + 其余辅助检测手段,进行文件研判。

参考文献

  • https://m.freebuf.com/articles/web/254913.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/713845.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity中的伽马(Gamma)空间和线性(Linear)空间

伽马空间定义&#xff1a;通常用于描述图像在存储和显示时的颜色空间。在伽马空间中&#xff0c;图像的保存通常经过伽马转换&#xff0c;使图片看起来更亮。 gamma并不是色彩空间&#xff0c;它其实只是如何对色彩进行采样的一种方式 为什么需要Gamma&#xff1a; 在游戏业…

53. QT插件开发--插件(动态库so)的调用与加载

1. 说明 在使用QT进行插件库的开发之后,还需要将这个插件库程序生成的so动态链接库加载到主程序框架中进行使用,才能达到主程序的模块化开发的效果。在前一篇文章插件创建中介绍了如何在QT中开发插件库,并提供外部接口调用。本篇博客的主要作用是模拟在主程序框架中加载动态…

诊断丢帧:发送端连续帧发送过快,导致接收端丢帧

项目场景: 在项目开发过程中,对于报文的接收/发送,一般来说,通信量大,选择Polling(轮询)处理模式;通信量小,选择Interrupt(中断)处理模式。具体选择没有优劣之分。结合项目的实际情况,选择适合项目的方式就好。小编将分享一个Polling模式下出现的丢帧现象。 1576…

Docker镜像技术剖析

目录 1、概述1.1 什么是镜像&#xff1f;1.2 联合文件系统UnionFS1.3 bootfs和rootfs1.4 镜像结构1.5 镜像的主要技术特点1.5.1 镜像分层技术1.5.2 写时复制(copy-on-write)策略1.5.3 内容寻址存储(content-addressable storage)机制1.5.4 联合挂载(union mount)技术 2.机制原理…

C# WPF入门学习主线篇(十五)—— DockPanel布局容器

C# WPF入门学习主线篇&#xff08;十五&#xff09;—— DockPanel布局容器 欢迎来到C# WPF入门学习系列的第十五篇。在前几篇文章中&#xff0c;我们探讨了 Canvas、StackPanel 和 WrapPanel 布局容器及其使用方法。本篇博客将介绍另一种强大且常用的布局容器——DockPanel。…

打造成功的人力RPO项目:赢得市场赚取利润

人力资源外包(RPO)项目是当今企业在招聘和人才管理方面越来越倾向的选择。想要通过人力RPO项目赚钱&#xff0c;以下是一些关键的策略和步骤&#xff0c;帮助您进入这个市场并取得成功。 1. 建立专业的人力RPO服务 首先&#xff0c;要想在人力RPO项目中赚钱&#xff0c;必须建立…

HCIA11 网络安全之本地 AAA 配置实验

AAA 提供 Authentication&#xff08;认证&#xff09;、Authorization&#xff08;授权&#xff09;和 Accounting&#xff08;计费&#xff09;三种安全功能。 • 认证&#xff1a;验证用户是否可以获得网络访问权。 • 授权&#xff1a;授权用户可以使用哪些服务。 •…

AOP切面加自定义注解,实现日志记录

AOP切面加自定义注解&#xff0c;实现日志记录 一、AOP二、准备工作三、添加AOP&#xff0c;把日志保存到数据库 一、AOP 在软件业&#xff0c;AOP为Aspect Oriented Programming的缩写&#xff0c;意为&#xff1a;面向切面编程&#xff0c;通过预编译方式和运行期动态代理实…

debug调试高级功能 断点、布局 及Android Studio常用快捷按键使用详情

文章目录 debug断点篇&#xff1a;打临时断点&#xff08;只用一次&#xff09;&#xff1a;alt断点条件断点&#xff1a;在断点上&#xff0c;点击右键&#xff0c;在Condition那里&#xff0c;设置我们需要的值&#xff0c;循环就会自动停到我们设置的那个值那里依赖断点&…

Markdown如何分页操作

Markdown导出分页操作 在平时的文档导出过程中Markdown过程中会出现因为不能分页导致的排版问题。 排版问题在将Markdown文档导出为PDF或其他格式时尤为明显。当文档内容超过一页时&#xff0c;无法自动调整页面布局&#xff0c;导致内容不连续&#xff0c;甚至导致图片或表格…

pve8群晖rr方式安装(编译失败检查网络或磁盘空间error 23:200问题解决)

PVE 篇二&#xff1a;2024年PVE8最新安装使用指南|安装黑群晖&#xff5c;img格式镜像安装_NAS存储_什么值得买 (smzdm.com) 黑群晖 篇五&#xff1a;2023黑群晖最新安装方式|RR新手也可轻松上手_NAS存储_什么值得买 (smzdm.com) 编译引导提示&#xff1a;检查网络或磁盘空间er…

qt dll编写和调用

dll编写 新建项目 头文件 #ifndef LIB1_H #define LIB1_H#include "lib1_global.h"class LIB1_EXPORT Lib1 { public:Lib1(); };//要导出的函数&#xff0c;使用extern "C"&#xff0c;否则名称改变将找不到函数extern "C" LIB1_EXPORT int ad…

程序员的核心职业素养:专业、沟通与持续学习

✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点赞、关注、收藏、评论&#xff0c;是对我最大…

单片机第五季-第八课:STM32CubeMx和FreeRTOS

1&#xff0c;FreeRTOS背景介绍 RTOS简介&#xff1a; 实时操作系统&#xff0c;本用于追求实时性的嵌入式系统&#xff0c;典型&#xff1a;ucos/uclinux/vxworks&#xff1b; 特点&#xff1a;中断响应快、一般可嵌套中断、使用实地址、多任务&#xff1b; &#xff08;实…

中国历年人均发电量统计报告

数据来源于国家统计局&#xff0c;为1978年到2020年我国每年的人均发电量数据。 2020年&#xff0c;我国人均发电量为5512.76千瓦时&#xff0c;比上年增长3.4%。 数据统计单位为&#xff1a;千瓦时 我国人均发电量有多少&#xff1f; 2020年&#xff0c;我国人均发电量为5512…

一键自动粘贴,高效处理邮箱地址,让你的工作效率翻倍提升!

在信息爆炸的时代&#xff0c;邮箱地址已成为我们日常工作和生活中的必备元素。无论是商务沟通、报名注册还是信息传递&#xff0c;邮箱地址都扮演着至关重要的角色。然而&#xff0c;手动复制粘贴邮箱地址的繁琐操作往往让人头疼不已&#xff0c;不仅效率低下&#xff0c;还容…

代码随想录第29天|贪心算法part3

134.加油站 首先如果总油量减去总消耗大于等于零那么一定可以跑完一圈 每个加油站的剩余量rest[i]为gas[i] - cost[i] 从0开始累加rest[i]&#xff0c;和记为curSum&#xff0c;一旦curSum小于零&#xff0c;说明[0, i]区间都不能作为起始位置 因为我们一直维护的是一个剩余量大…

Linux磁盘格式化与重新分区

1.df -BG查看磁盘挂载情况 2.fdisk -l查看磁盘详细信息 3.sudo mkfs.ext4 /path 格式化磁盘 4.挂载格式化后磁盘 挂载成功

FreeRTOS简单内核实现5 阻塞延时

文章目录 0、思考与回答0.1、思考一0.2、思考二0.3、思考三 1、创建空闲任务2、实现阻塞延时3、修改任务调度策略4、提供延时时基4.1、SysTick4.2、xPortSysTickHandler( )4.3、xTaskIncrementTick( ) 5、实验5.1、测试5.2、待改进 0、思考与回答 0.1、思考一 为什么 FreeRTO…

C++ 47 之 函数调用运算符重载

#include <iostream> #include <string> using namespace std;class MyPrint{ public:// 重载小括号() 重载谁operator后就紧跟谁的符号void operator()(string txt){cout << txt << endl;} };class MyAdd{ public:int operator()(int a, int b){retur…