sky's blog

Paper Summary & Detecting Webshell Based on Random Forest with FastText

字数统计: 1,566阅读时长: 6 min
2020/01/13 Share

前言

本篇paper来自ICCAI 2018,采用了fastText和随机森林算法相结合的模型FRF-WD,使用一些静态features和PHP opcode,对Webshell进行检测。但与之前的文章不同,本篇文章不再是基于HTTP流量检测,而是针对文件进行检测。

Background

Opcode是一种PHP脚本编译后的中间语言,对于PHP的语言引擎Zend执行代码,会经过如下4个步骤:

1
2
3
4
1.Scanning(Lexing) ,将PHP代码转换为语言片段(Tokens)
2.Parsing, 将Tokens转换成简单而有意义的表达式
3.Compilation, 将表达式编译成Opocdes
4.Execution, 顺次执行Opcodes,每次一条,从而实现PHP脚本的功能。

而现有的一些工作已经表明,通过opcodes的频率可以区分恶意软件和可信软件。虽然PHP Opcode不同于恶意软件识别中使用的Opcode,但是他们在本质上是一致的,故此,本篇文章想要借助PHP Opcode来对恶意php webshell文件进行检测。
PHP拥有拓展Vulcan Logic Disassembler (VLD),其可以hook Zend引擎,方便我们dump出所有的opcodes,例如如下一句话木马:

1
<?php eval($_POST['a']); ?>

如果我们运行该webshell,通过VLD,我们可以得到:

而作者正是想利用fastText和VLD得到的Opcode,训练文本分类器模型。

实现方法

FRF-WD模型对于文件的特征提取,可以分为两大步:

  1. 分析提取文件的静态特征
  2. 利用PHP-VLD获取文件的Opcode,利用fastText训练文本分类器模型。
    然后再利用上述获取的特征作为随机森林的输入,训练一个webshell检测模型。

    静态特征

    对于文件的静态特征,作者选取了如下5种:
    1.长字符串
    为了bypass现有的webshell检测,大多数的webshell会进行混淆,其惯用技术是利用编码,如base64,但其缺点就是对于一个较短的webshell,会经过编码,拼接变成一个很长的字符串。并且只检测php tag中的长字符串,可以有效避免富文本,js,图片,video或是css文件的干扰。
    2.信息熵(Information Entropy)
    由于内容加密会增加信息熵,所以计算信息熵是检测加密webshell的一个非常好的手段。
    3.IC(Index of Coincidence)
    IC在分析自然语言明文和密文中非常有用,如果IC值较低,那么表明文件中可能存在混淆或加密。
    4.关键词搜索
    如果文本文件中存在敏感词,诸如:
    1
    eval(), assert(), exec(), shell_exec(), passthru(), system(), show_source(), proc_open() and pcntl_exec()

则会被认为是一个可疑文件。
5.黑名单
如果文件中检测到诸如:

1
2
3
4
5
webshell by 
hack by
bypass AV
password is *
etc .....

那么可以认为其是一个可疑危险文件,因为一般正常文件的注释中不会存在这些语句。

PHP Opcode特征

考虑到PHP文件可以利用PHP-VLD快速得到PHP Opcode,那么可以尝试使用文本分类器来识别webshell。在本文中选用了fastText模型来训练文本分类器。
fastText是一个快速文本分类算法,与基于神经网络的分类算法相比有两大优点:
1、fastText在保持高精度的情况下加快了训练速度和测试速度
2、fastText不需要预训练好的词向量,fastText会自己训练词向量
3、fastText两个重要的优化:Hierarchical Softmax、N-gram
同时,对于不同的文件,Opcode的数量可能只有少量,也可能有上千个,所以fastText比传统的深度学习方法TextCNN更适合处理这样的数据集。
工作大致分为3步:

  1. 通过PHP-VLD,将PHP文件代码转化为PHP Opcode;
  2. 使用fastText和标记好的样本对文本分类器进行训练;
  3. 使用训练好的文本分类器去判断哪些标记过的文本来自PHP Opcode;
    最终得到的预测值用于文件Opcode的特征值。

    分类器

    在特征提取结束后,使用随机森林方法实现分类。
    集成学习是通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的做出预测。
    而随机森林是集成学习的一个子类,它依靠于决策树的投票选择来决定最后的分类结果。同时随机森林具有快速、高效、预测精度高等特点。同时其在生成过程中,能够获取到内部生成误差的一种无偏估计。

数据实验

作者收集了共计8521个PHP文件,其中包括1587个PHP Webshell,其来自于github上一些webshell Project。对于正常文件来自于几个著名PHP框架,例如Yii2、Wordpress、CI等。
对于数据集,30%用于构建PHP Opcode文本分类器,70%用于随机森林的训练和模型测试。
为了证明FRF-WD模型的性能,作者使用了如下几个公式进行评估:
TP:True Positive
TP是正确分类为webshell文件的个数。
TN:True Negative
FN是错误分类为良性文件的webshell文件的个数。



由于在fastText模型中,word-Ngram是一个重要参数,为了找到最适合的N-gram,作者测试了n=1 ~ n=6,效果如下:

可见最佳的N-gram是4-gram。
同时作者比较了随机森林模型,和随机森林与fastText相结合的模型性能的差异:


可见在不考虑PHP Opcode特征下,随机森林的准确率仅为88.97%,而在FRF-WD模型下,准确数在97.92%。同时ROC曲线也能说明FRF-WD模型拥有更好的性能。

后记

本文与之前的工作不同,之前的webshell检测使用了CNN对text进行分类,而本文则使用了fastText和随机森林结合的方式进行webshell检测。

参考链接

http://www.laruence.com/2008/06/18/221.html
https://blog.csdn.net/feilong_csdn/article/details/88655927
https://www.cnblogs.com/gczr/p/7097704.html

点击赞赏二维码,您的支持将鼓励我继续创作!
CATALOG
  1. 1. 前言
  2. 2. Background
  3. 3. 实现方法
    1. 3.1. 静态特征
    2. 3.2. PHP Opcode特征
    3. 3.3. 分类器
  4. 4. 数据实验
  5. 5. 后记
  6. 6. 参考链接