Webshell检测方法(一) - 嘶吼 RoarTalk – 回归最本质的信息安全,互联网安全新媒体,4hou.com

Webshell检测方法(一)

一叶飘零 技术 2020-02-06 10:00:00
收藏

导语:最近在学习webshell检测技术,看了一些科研性的文章,所以有了这个系列的文章。

前言

本篇paper来自ICNCC 2017,论文中指出,本篇文章是第一篇将CNN应用到恶意webshell检测上的文章。其对于webshell的检测主要集中于HTTP Requests检测。

背景知识

Webshell对网络服务会产生巨大的恶意作用,攻击者将Webshell上传至受害者服务器,达到持久化控制的目的。而本篇paper旨在检测恶意webshell,防止攻击者利用webshell进行二次攻击。

作者将检测放在HTTP Requests中,主要对用户的GET请求和POST请求进行检测分析。考虑到CNN在文本分类上已经有重大突破,工具word2vec在text分类上已经有比较好的效果,同时HTTP Requests流量和文本内容很相似,可以尝试将文本分类上比较成熟的方法应用于webshell检测。

但比较不同的是,HTTP Requests内容不同于普通的文本,它包含了许多的特殊符号,因此不能简单将word2vec迁移至HTTP Requests流量检测。

实现方法

因此可设计如下CNN-webshell模型,并从4个层面进行分析:

* 数据输入层/ Input layer

* 卷积计算层/ CONV layer

* ReLU激励层 / ReLU layer & 池化层 / Pooling layer

* 全连接层 / FC layer

2020-01-10-11-06-09.png

数据输入层/ Input layer

在HTTP Requests流量中,文本没有空格进行分割,所以想要实现在文本分类上应用比较好的技术,首先需要进行词切分。

paper中指出,诸如中国菜刀的流量中,有如下特征:其对于每个参数字符串,有很多部分被\&分割开,同时在流量中还有许多诸如:( ) {  }  /  \  @的符号,这些符号也可用于文本的分割。

2020-01-09-10-40-29.png

例如如上中国菜刀流量,可以利用特殊符号将其分割成如上文本。然后将分割后的文本进行如下操作:

对于给定的一个单词i,给其对应的一个向量:

2020-01-10-10-38-45.png

其中d为向量空间的维数。那么对于一个由n个单词组成的句子,它可以表示为如下矩阵:

2020-01-10-10-39-55.png

这样一来,长度为n的句子,可以转化为大小为n*d的矩阵。同时,每一条句子的长度都规定为n,若不足n个单词的句子的会使用零向量进行补齐。如此一来,就可以得到n*d的矩阵输入。

卷积计算层/ CONV layer

在这一个层,需要做局部关联,每个神经元看做一个滤波器filter:

2020-01-13-10-19-44.png

此处h是滑动窗口的宽度,在当前环境里就是每次h个单词。此处使用的是1D卷积,即使用宽度为h的滑动窗口对每行进行卷积:

2020-01-13-11-15-57.png

对于矩阵:

2020-01-13-10-20-49.png

我们可以得到卷积结果为:

2020-01-13-10-21-07.png

其中b是偏差,f是非线性校正函数。对于整个句子,其卷积结果是一个特征向量:

2020-01-13-10-22-11.png

这一层我们可以简单理解,从输入的单词矩阵中提取features。

ReLU激励层 / ReLU layer & 池化层 / Pooling layer

在结束了卷积后,需要在feature map上选出最大值2020-01-13-10-34-16.png来作为和特定滤波器W对应的特征。

Max pooling的思想大致如下:

2020-01-13-13-51-33.png

对于每个2*2的窗口选出最大的数作为输出矩阵的相应元素的值,比如输入矩阵第一个2*2窗口中最大的数是6,那么输出矩阵的第一个元素就是6,如此类推。

那么利用池化层获取的结果串联起来,得到特征向量Z:

2020-01-13-10-36-05.png

再交由ReLU进行激活操作:

2020-01-13-10-37-24.png

激励函数一般采用ReLU(The Rectified Linear Unit/修正线性单元),原因是其收敛快,求梯度简单,但较脆弱。

在这一层中,我们可以简单理解成从众多的features中选出最有影响力的features,用以压缩数据和参数的量。

2020-01-13-16-38-34.png

全连接层 / FC layer

两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。也就是跟传统的神经网络神经元的连接方式是一样的:

2020-01-13-13-53-43.png

在本层中,加入了Dropout来抑制过拟合问题。dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率将其暂时从网络中丢弃。每次做完dropout,相当于从原始的网络中找到一个更瘦的网络,如下图所示:

2020-01-13-10-47-14.png

经过softmax函数后,结果输出是一个概率分布: 每个元素都是非负的, 并且所有元素的总和都是1。

softmax log-loss函数:

2020-01-13-10-51-32.png

在本层中,我们可以理解为,在提取出众多的features后,我们需要做一个整合,对其进行权重划分,最后再进行判别。

数据实验

在实验部分,收集了如下数据集:3691个webshell,3990个正常样本。

实验中首先分析了工具word2vec的作用,word2vec生成的向量可用于度量词之间的相似性,我们从下图中可以看出,恶意操作词(webshell中常见的词)彼此非常接近,但正常的词则分散很远。

2020-01-09-10-40-14.png

同时为了验证模型的性能,其与几种经典的分类器做了对比:

* Naive Bayes (NB)

* k-Near Neighbour (kNN)

* Decision Tree (DT)

* Support Vector Machine (SVM)

* traditional Neural Network (NN) using the TF-IDF feature representation

所有的分类器都使用相同的feature。

2020-01-13-11-05-05.png

同时考虑到向量空间的维度有显著的影响,可测试不同维数来评价其性能:

2020-01-13-11-10-35.png

在维度200时,实现了最佳的性能。但是由于训练时间随维度增加而增加,还要考虑到效率问题。

同时实验也证明了模型训练过程可以快速收敛:

2020-01-13-11-27-56.png

后记

本篇paper基于word2vec和CNN提出了一种新型检测WebShell的技术,同时和其他经典分类器相比,取得了最好的性能。

webshell检测的工作大多基于机器学习,由于在这个领域本人也是新人,正在学习。如文中有错误,还请大佬们多多斧正!

本文为 一叶飘零 原创稿件,授权嘶吼独家发布,如若转载,请注明原文地址
  • 分享至
取消

感谢您的支持,我会继续努力的!

扫码支持

打开微信扫一扫后点击右上角即可分享哟

发表评论