K近邻算法检测meterpreter

K近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分类到这个类中。以下图为例
在这里插入图片描述

有两类不同的样本数据,分别用蓝色的小正方形和红色的小三角形表示,而图正中间的那个绿色的圆所标示的数据则是待分类的数据。来了一个新的数据点,我要得到它的类别是什么
如果K=3,绿色圆点的最邻近的3个点是2个红色小三角形和1个蓝色小正方形,少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于红色的三角形一类。如果K=5,绿色圆点的最邻近的5个邻居是2个红色三角形和3个蓝色的正方形,还是少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于蓝色的正方形一类
这就是k近邻的简单的原理解释

本次我们会用到scikit来实现k近邻算法与web安全的交叉应用,主要用到的是 scikit-learn 库中的 neighbors.KNeighborsClassifier
我们使用官方给出的例子来演示一下
首先是导入所需的库,这里我们是让sklearn.neighbors处理numpy数组
在这里插入图片描述

然后简单创建一个数组并调用NearestNeighbors开始训练
在这里插入图片描述

这里的n_neighbors是指定邻居的数量,algorithm指定计算最近邻的算法,有四个可选,分别是ball_tree,kd_tree,brute,auto。Ball_tree会使用balltree算法,kd_tree会使用kdtree算法,brute会使用把暴力搜索,auto则会根据传给fit方法的值来自动选择最合适的算法
之后调用fit方法将X作为训练集来拟合模型
接着通过keighbors方法找到一个点的k个邻居,该方法会返回distance,indices分别表示点的长度的数组和矩阵中最近点的索引
在这里插入图片描述

进一步可以将其可视化
kneighbors_graph计算X中点的k邻居图,其会返回一个稀疏矩阵
在这里插入图片描述

接下来我们看看如何使用knn检测meterpreter
我们将会使用ADFA-LA数据集中meterpreter相关的数据。ADFA数据集是澳大利亚国防学院(缩写为ADFA)对外发布的一套主机级入侵检测系统的数据集合,被广泛应用于入侵检测类产品的测试。数据集内已经将各类系统调用完成了特征化,并针对攻击类型进行了标注。
数据集解压后有三个文件夹
在这里插入图片描述

Attack_Data是标记为恶意的数据,Training_Data是标记为正常的数据,Validation_Data是评估模型误报率
在Attack_Data中包含6类攻击,分别为Adduser、Hydra_FTP、Hydra_SSH、Java_Meterpreter、Meterpreter、Web_Shell
本次我们要使用的是Meterpreter
在这里插入图片描述

我们以meterpreter_1为例打开看看
在这里插入图片描述

查看第一个txt
在这里插入图片描述

可以看到数据集已经对捕获的系统调用进行了处理,对每一个捕获的系统调用都使用唯一的数字进行代替,对应的关系文件下载地址在这里
https://www.researchgate.net/profile/Obinna_Igbe/post/Were_can_I_get_a_labelled_version_of_the_ADFA-LD_dataset_for_HIDS_evaluation/attachment/59d6283879197b8077986958/AS%3A329293344329728%401455521059484/download/ADFA-LD%2BSyscall%2BList.txt
内容大概如下
在这里插入图片描述

大概了解了数据集之后,我们来看看代码

和python本身相关的代码我们就不具体介绍了,比如
读取文件的代码
在这里插入图片描述

遍历目录下文件的代码
在这里插入图片描述

重点看和机器相关的代码,首先是加载数据
加载正常的样本数据
在这里插入图片描述

加载攻击数据集中和meterpreter相关的数据,由于我们从前面看到相关的文件夹命名规律为meterpreter_,所以使用相应的正则匹配即可
在这里插入图片描述

这里y用于打标签,1表示为webshell,0表示正常

将其打印出来看看
在这里插入图片描述

结果如下
在这里插入图片描述

可以看到每个文件包含的函数调用序列的个数都不一致,所以需要对其进行特征化

CountVectorizer 类会将文本中的词语转换为词频矩阵,例如矩阵中包含一个元素a[i][j],它表示j词在i类文本下的词频;通过 fit_transform 函数计算各个词语出现的次数;通过 toarray()可看到词频矩阵的结果
在这里插入图片描述

同样将其打印
在这里插入图片描述

结果如下
在这里插入图片描述

说明我们的特征化工程已经做好了
接下就是训练样本了,很简单,就是
在这里插入图片描述

KNeighborsClassifier是实现k近邻算法的分类器,n_neighbors指定邻居的数量
Cross_val_score通过交叉验证评估出一个得分,这里clf就是用于要评估的对象,x是要拟合的数据,y是要尝试预测的目标,n_jobs指定参与计算的cpu数量,-1意味着指定使用所有的处理器,cv=10则是指定10折交叉验证
然后打印出每一次的分数以及平均分数
测试如下
在这里插入图片描述

从结果可以看出,准确率达到了96%左右,还算不错。

实验到这结束了吗?
那不是浪费了这么多数据集了吗
前面说过这个数据集中还有其他5类攻击,我们完全可以使用相同的代码检测其他的攻击,比如hydra_ssh,这是ssh爆破攻击的数据,我们只需修改代码的这一行可以了,脚本名为hydra.py
在这里插入图片描述

测试如下
在这里插入图片描述

参考:
1.<web安全之机器学习入门>
2.http://lijiancheng0614.github.io/scikit-learn/modules/generated/sklearn.neighbors.NearestNeighbors.html
3.https://www.unsw.adfa.edu.au/unsw-canberra-cyber/cybersecurity/ADFA-IDS-Datasets/
4.https://scikit-learn.org/stable/modules/neighbors.html
5.https://hyjal.net/2018/09/29/ADFA-LD/
6.https://github.com/duoergun0729/1book/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值