一、关于Webshell。
分为Web和shell,Web相当于对外开放的Web服务,Shell是用户与操作系统之间的一个接口,操作过程中更多的是脚本语言,Webshell某种情况下是网站密码。它更多的是对网站高危操作,具备高危操作权限。支持的脚本是ASP、PHP、ASP.NET、JSP等。什么情况下Webshell需要呢?一般是我们对网站进行渗透测试后期时,发现这个网站没有更高权限了,但我们希望它提权,二是长期供应,这时候Webshell就会想到它。
Webshell主要功能。
除了一般的环境探针、资源管理器、文件编辑等,还有权限提升,上面一般会带内置的POC,还有DDoS对待网络挂马。还有黑帽SEO,前段时间一个大型网络厂商出现一个症状,输入自己官方网站URL没有问题,可以正常访问,但当他通过百度或者搜狗、360搜索引擎搜索时,直接跳转到菠菜网站,当我们后期介入它的应急保障之后,分析跟踪发现它的服务器存在一些安全漏洞,被植入了14个各种类型的Webshell,相当于是个跑马场。
Webshell的分类。
业界一般会分为三大类:大马、好马和一句话马。大马是什么事儿都能干,前面的基本功能、拓展功能都具备;小马作为文件上传,为上传大马做准备的一个跳转平台。一句话木马相对比较精简一些,后面是一句话木马的类型,数据模型和数据传递。
Webshell的特点。
它会调用一些系统高危函数,比如eval、system,会有一些操作系统文件函数,比较多的是Webshell相对一般网站正常网页访问IP会比较少,访问次数也比较少,相当于是个孤立页面。但孤立页面不一定就是Webshell,比如隐藏性的管理后台也存在这种情况。Webshell在系统日志里是看不到的,主要是在网站Web日志,访问Webshell页面时会产生访问数据。
二、针对Webshell的检测。
第一,静态检测(静态特征检测)。
抽取它的典型特征,比如一句话木马有一些常见代码块,不同的攻击者会对它进行改造,大致模型是不变的。高危函数,修改时间是不是相对其他文件不一样。井台核心检测依然匹配它的核心特征,比如正则、文件时间聚类、文件关联度计算。典型Webshell的静态性特征,检测时目前市场上商用工具和看用工具基本都能支持。
它的特点是基于规则,会比较快,但漏报、误报会比较明显,一般的Webshell一句话木马变形混淆会比较多。
第二,日志分析检测。
个别访问,Webshell页面访问次数比较少,访问总数也比较少,上专Webshell到Web目录时会自动化重命名,一般是随机化的比较长的名称。在GET请求里也有相对比较明显的控制指令。
日志分析也有一些优缺点,网站新增页面,在一些大的网站会比较明显,用日志分析方法,但在一些中小型网站时和传统的Webshell检测、正常网页区别不是特别大。毕竟是日志分析,相当于是事后的,难以触及运维Webshell自身本质,就是它的脚本语言。
第三,动态检测。
类似于一个沙箱机制,不管云平台还是服务器本地,Webshell分析检测层我们会用hook调用它的可疑函数,这是相对比较精确的,但也有一些问题,这是我们在实践过程中遇到过,在本地会有一些开销,而且开销还是比较大的,在用户的服务器上。如果我们把它放到一个云平台上去做时,有很多Webshell是加密的,如何绕过它的加密机制或解决它的自动执行问题,这是在云平台上需要解决的问题。
第四,统计学检测。
除了之前几个方法以外,基于统计学的,主要是长字符串,一般Webshell用base646(115)密码之后字符会比较长,还有信息熵、重合指数、压缩码的方式,来看卡Webshell的可能,激励的可能性比较大。基于统计学的,也有一些漏报误报的情况。
三、悬镜自身工作理念。
深度学习。
我们采用深度神经网络算法。神经深度网络具有端到端的学习能力,可以将我们研究对象原始表示方法直接输入到模型中,从而避免人工设计特征带来的劣势,只要是特征,就涉及到特征颗粒度问题;一定会对原有信息有一定损耗。脚本原码输入模型,我们做预处理,相对原先的脚本原代码,我们做了去噪,比如空格、换行符等做了处理,对字符串的线性结构转换成更清晰,更紧凑的树型结构,比如抽象语法树。还涉及数据压缩和向量化技术。
我们提出一些流水线整个检测流程,包括预处理、样本生成和检测模块。(图)我们实现的关键技术是基于词法单元流的循环神经网,主要流程包括预处理模块,样本生成模块、检测模块。预处理模块,我们做的主要工作是分词,分词做完之后我们还可以对一些加密文件根据再处理,处理完再做基本的过滤和替换。接下来是样本生成模块,考虑到不同的脚本文件它生成的词法单元流的差距较大,比如一个大马形成的我们对应处理的文件有几万个节点,但一句话木马有几十个,差异巨大。
我们采用了两种方法,一是完全随机的采样、抽样,二是采取贪心算法的抽样。最终形成利用Word 2 vactor(音),将它向量化提交给我们的机器学习模型。
预处理模块主要做了一些词法分析,按照字符读取脚本原代码,最后将属于同一个词法单元的字符组合在一起,也就是词法单元对象,我们并为其添加一些属性。
我们在实践过程中也遇到了加密的情况,对字符串进行尝试解码,做完解码之后再做尝试词法的分析,直到结束。接下来我们对字符串、整数、浮点数的常量按统一规则做整体的替代。比如马化腾、马云,我们认为在不同上下文中其实代表了是一类,李彦宏标记时我们也用一类,类似于用shot int种统一的字符串常量统一标记。
神经网络,这是我们在实践过程中经典的RNN神经网络模型。为什么用这种模型呢?主要原因是我们的词法单元流向量长度不一,它具有上下文的关系。大家如果熟悉RNN算法的话应该知道,它对序列化处理能力,特别是添加了一些记忆单元处理得比较出色,向量1、向量2的我们提交的一些输入,通过LSTM,长短期进行二层处理,处理完交给我们拼接层,再进一步将中间结果处理之后交给三层全链接层。层数的一层两层三层,基本根据大家在训练中的经验进行调仓,当然层数处理复杂问题越强,但带来的训练损耗也会越大。
除了TNS-RRN技术之外,我们自己尝试创新发明了一个基于抽象语法树的递归循环神经网络,它相对于前面的TNS-RRNN最主要的区别是,对抽象语法树,语法分析做了更进一步的处理,在前期预处理主要做了抽象语法树的构建。前面也重点强调了,一般脚本文件的大马抽象语法树有上万个节点,一般木马是几十个节点,差距是巨大的,这样的情况下,我们需要对抽象语法树进行进一步压缩。我们实心的路径是,对一般的抽象语法树会用一组规模较小的抽样指数进行替换,最后交给检测模块LSTM进行处理。
抽象语法树主要是语法分析器对词法单元流进行语法分析,构造出一个抽象语法树,比如图中加法复制语句可以自然构造出一个抽象语法树,但这个抽象语法树里的噪音还是比较多的。接下来我们考虑对这个树进行简化,一是分叶节点,叶节点通常存放标量信息,例如自定义变量名、常量值等,我们需要把叶节点单独提取出来进行亮相化表示,后期训练直接提交给训练模型。二是辅助节点基本提供的是辅助信息,对我们后续的构造没有多大帮助,经过反复实验,我们是将一些辅助信息删除,最后得到简化后的抽象语法树。
叶子节点向量化表示。
深度学习模型核心是数学计算模型,它的输入是向量化表示,操作方法从两个方面入手,一是危险函数,构建危险函数列表,将叶子节点包含的危险函数用词袋模型表示。二是统计特征,统计学上,主要是5个,NeoPi方法中字符串长度、重合指数、信息熵几个重要指标考虑进去,嵌入到程序代码和编码中,其中重合指数代表的是字符串序列里任意的一段函数重合的概率,重合概率越大代表相当于它是个正常文件,一般Webshell经过编码或加密之后随机性会比较大。
基于抽象语法树的递归循环神经网络的检测模块。
我们依据语法树的递归思想,一般一棵树的向量化表示主要由它的根结点及子树结合的根节点,通过非线性结合运算而成。前面的叶子节点向量化表示主要是通过特征工程,比如它的一些规则,统计学的方法把它形成我们向量化表示,而对于子树集合的向量化表示,通过依次将它们输入到LSTM长短期记忆层进行计算而成。最后提交给拼接层,由拼接层将中间处理结果提交给全链接层,最后做预期处理。
这是我们通过深度学习得出来的一个结果,无论是在准确率还是召回率上,前几年有比较火的SVM知识向量机的方法大幅度提升。我们对前两种方法做了综合,将中间结果提交给选型训练结果,准确率和召回率上有进一步提升。通过市面上一些规则检测的产品还是有明显优势。这里要提一下,这也有今后需要改进的地方,比如检测时间,SVM是300毫秒左右,在检测率比较高的计算模型能达到900毫秒,这对于实际的商用部署还是有一些影响,所以我们将它部署到我们GPU云平台上。
我们全球安全实验室在Webshell检测方面所做的工作。
将研发基于词法单元流、神经网络和抽象语法树,递归循环神经网络Webshell检测等技术,这个技术已经申请了专利,将这些技术应用到我们产品神经复习卫士(音)当中,并已经提供商用。在Web安全威胁深度检测上,去年12月份全球安全实验室发布了第一款国内第一看用深度学习SQL注入检测并提供公测,也得很多团队进行深度学习,正式发布出来的用于SQL注入检测的我们当时是第一家做到的。
除了Webshell检测以外,语言分析技术和深度学习技术结合,也将在恶意代码分析、漏洞挖掘等诸多安全领域发挥重要作用。