Webshell检测方法(三)
2020-02-19 10:15:00 Author: www.4hou.com(查看原文) 阅读量:297 收藏

Webshell检测方法(一)

Webshell检测方法(二)

0x01 前言

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

0x02 Background

Opcode是一种PHP脚本编译后的中间语言,对于PHP的语言引擎Zend执行代码,会经过如下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,例如如下一句话木马:

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

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

2020-01-13-14-28-06.png

而我们正可以利用fastText和VLD得到的Opcode,训练文本分类器模型。

0x03 实现方法

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

1. 分析提取文件的静态特征

2. 利用PHP-VLD获取文件的Opcode,利用fastText训练文本分类器模型。

然后再利用上述获取的特征作为随机森林的输入,训练一个webshell检测模型。

1、静态特征

对于文件的静态特征,选取如下5种:

1.长字符串

为了bypass现有的webshell检测,大多数的webshell会进行混淆,其惯用技术是利用编码,如base64,但其缺点就是对于一个较短的webshell,会经过编码,拼接变成一个很长的字符串。并且只检测php tag中的长字符串,可以有效避免富文本,js,图片,video或是css文件的干扰。

2.信息熵(Information Entropy)

由于内容加密会增加信息熵,所以计算信息熵是检测加密webshell的一个非常好的手段。

3.IC(Index of Coincidence)

IC在分析自然语言明文和密文中非常有用,如果IC值较低,那么表明文件中可能存在混淆或加密。

4.关键词搜索

如果文本文件中存在敏感词,诸如:eval(), assert(), exec(), shell_exec(), passthru(), system(), show_source(), proc_open() and pcntl_exec(),则会被认为是一个可疑文件。

5.黑名单

如果文件中检测到诸如:

webshell by 、

hack by、

bypass AV、

password is *、

etc .....

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

2、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的特征值。

3、分类器

在特征提取结束后,使用随机森林方法实现分类。

集成学习是通过建立几个模型组合的来解决单一预测问题。它的工作原理是生成多个分类器/模型,各自独立地学习和作出预测。这些预测最后结合成单预测,因此优于任何一个单分类的做出预测。

而随机森林是集成学习的一个子类,它依靠于决策树的投票选择来决定最后的分类结果。同时随机森林具有快速、高效、预测精度高等特点。同时其在生成过程中,能够获取到内部生成误差的一种无偏估计。

2020-01-13-15-24-43.png

0x04 数据实验

实验收集了共计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文件的个数。

2020-01-13-15-12-15.png

2020-01-13-15-12-21.png

2020-01-13-15-12-27.png

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

2020-01-13-15-16-02.png

可见最佳的N-gram是4-gram。

同时实验比较了随机森林模型,和随机森林与fastText相结合的模型性能的差异:

2020-01-13-15-17-50.png

2020-01-13-15-19-16.png

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

0x05 后记

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

0x06 参考链接

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

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


文章来源: https://www.4hou.com/posts/51ZX
如有侵权请联系:admin#unsafe.sh