牛牛逼逼叉叉
菜单

浅谈webshell检测方法

2014年01月16日,分类《网络安全》,作者:
博客捐助

1389623694118.jpg


一  什么是webshell


“web”的含义是显然需要服务器开放web服务,“shell”的含义是取得对服务器某种程度上操作权限。webshell常常被称为匿名用户(入侵者)通过网站端口对网站服务器的某种程度上操作的权限。
简单理解:webshell就是一个web的页面,但是它的功能非常强大可以获得一些管理员不希望你获得的权限,比如执行系统命令、删除web页面、修改主页等。
webshell中由于需要完成一些特殊的功能就不可避免的用到一些特殊的函数,我们也就可以对着特征值做检查来定位webshell,同样的webshell本身也会进行加密来躲避这种检测。

二  webshell长什么样子


下图就是一张php webshell的截图,它的功能还是比较全的,如果你是网站管理员的话肯定是不希望普通用户获得下面的权限的。

13895909514918.jpg

三   webshell检测有哪些方法


如果你怀疑你的网站被人上传了webshell或者你需要检查一下需要上线的代码中是否被嵌入了shell代码,就需要对这些文件进行扫描,那么有哪些方法可以扫描出这些webshell呢?
下面列举一下,也就是我们的webshell扫描工具中实现的功能。
1 求文件的重合指数index of coincidence(缩写为IC)
首先介绍一下什么是IC?

13895909984726.jpg

IC是用来判断文件是否被加密的一种方法。它的计算公式是这样的:

Σ(fi * (fi-1))/N(N-1)    :fi 代表样本中某个字母出现的比率,N代表字母出现在样本中的个数

通过计算,我们可以得到以下两个值:

english的IC值为0.0667,
english中一个完全随机的字符串的IC值为0.0385

那么这两个值有什么意义呢?
简单来说(english),
加密文件的IC值接近0.0385
明文文件的IC值接近0.0667
好了,那么我们就可以计算每个文件的IC值,如果这个文件的IC值接近0.0385,那么我们认为它是加密的,而一个web中加密的文件一般就意味着它是个为了逃避检测的webshell。
2   求信息熵
    信息熵是一个数学上颇为抽象的概念,在这里不妨把信息熵理解成某种特定信息的出现概率(离散随机事件的出现概率)。一个系统越是有序,信息熵就越低;反之,一个系统越是混乱,信息熵就越高。信息熵也可以说是系统有序化程度的一个度量。
    熵是从整个集合的统计特性来考虑的,它从平均意义上来表征信源的总体特征,其公式为:

13895910352824.jpg

如果有一个系统S内存在多个事件S = {E1,…,En}, 每个事件的机率分布 P = {p1, …, pn},则每个事件本身的讯息为

Ie = ? log2pi

(对数以2为底,单位是位元(bit))

Ie = ? lnpi

(对数以e为底,单位是纳特/nats)
如英语有26个字母,假如每个字母在文章中出现次数平均的话,每个字母的讯息量为

I_e = -log_2 {1over 26} = 4.7

而汉字常用的有2500个,假如每个汉字在文章中出现次数平均的话,每个汉字的信息量为

I_e = -log_2 {1over 2500} = 11.3

整个系统的平均消息量为

H_s = sum_{i=1}^n p_i I_e = -sum_{i=1}^n p_i log_2 p_i

因此我们可以求每个文件的信息熵值,值越大,为webshell的可能性越高。
3、求文件中的最长单词
    求一个文件中的最长单词是多长,比较异常的长单词是很可疑的。如下面的第一位的有84070,毫无疑问他是加密后的一整串字符串,极有可能是webshell

84070        /home/wwwroot/default/webshell/css.php

4、文件的可压缩比
文件的压缩比=压缩文件后的大小/文件的原始大小。
那么什么样的文件的压缩比比较大呢?这就要说到压缩算法的本质:
压缩的实质,在于消除特定字符分布上的不均衡,通过将短码分配给高频字符,而长码对应低频字符实现长度上的优化。
做了个简单的实验:将一个txt文件中填充了一堆的a字符,总大小为345KB,用7z压缩后为1K

1389591069306.jpg

那么我们是否可以这样理解,由base64编码过的文件,消除了非ascii的字符,这样实际上base64编码过的文件的字符就会表现为更小的分布的不均衡,压缩比就会变大。
5、特征值匹配
这里提到的特征值匹配分为2个部分:第一个是匹配特征函数和代码,也就是说webshell中会用到的而一般文件不会用到的函数和代码。第二个是指匹配特定webshell中的特征值。
第一种情况我们需要对这些函数和特征代码做整理,然后与文件进行匹配。
第二种情况需要收集出现过的webshell,将其中的特征码提取出来。目前已知的库位500个webshell的特征库,可以准确识别99%的已知的webshell。
6、文件属性
第一种:在web服务器中,文件一般的创建时间是几种的,如果某些文件的创建时间比较异常,那么它就有可能是webshell。
第二种:在web攻击过程中,有一种手法是利用mysql到出一句话木马到web目录中,那么这个导出的文件有其特殊性,所有导出的文件的权限都是666.那么我可以这么认定,权限为666的文件有可能是webshell。

四 朴素贝叶斯模型


以上几种方法都有其准确率和误报情况,经过测试,每个方法都能检测出一部分webshell并且存在着一定程度的误报,那么如何将他们的检测结果整合起来,来更准确的判定一个文件是否webshell?
由于我们的检测方法基本上是离散的,所以考虑使用朴素贝叶斯模型。
首先用数学语言描述一下我们的问题:
一个文件的检测结果有两种:是webshell和不是wenshell。那么检测结果是webshell的概率我们用P(y=1)来表示,检测结果不是webshell的概率我们用P(y=0)来表示。
假设我们的检测方法有5种,那么x = [x1,x2,x3,x4,x5].
假设我们检测一个文件后各个检测方法的结果为:x1 = 1,x2=0,x3=0,x4=0,x5=1
那么我们的目的是计算出P(y=1|x)和P(y=0|x)。也就是计算出该文件是webshell和不是webshell的概率各是多少,概率更大的我们就做为最终结果。
下面我们推演一下:
首先是贝叶斯公式为:

13895911135881.jpg

那么我们需要的P(y=1|x)为:

13895911294030.jpg

由于P(y=1|x)和P(y=0|x)中的分母都是一样的,所以我们只要求出分子进行比较,那个值比较大就取那个值。
现在我们未知的值为p(x1=1|y=1),p(x2=0|y=1),p(x3=0|y=1),p(x4=0|y=1),p(x5=1|y=1),p(y=1)
这些值应该如何得到呢?
首先我们需要一个样本,样本中大量的web文件,其中混有各种webshell,这些标签我们是可以确定的,那么下面我们要做的就是利用程序对这些样本进行检测,根据检测结果计算出我们需要的值,比如:
p(x1=0|y=1):它代表的意思就是检测的文件是webshell,利用x1检测方法的检测结果为0(不是webshell)
如果结果为P(y=1|x)>P(y=0|x),我们就判定该文件是webshell。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

【上一篇】

原生js制作酷炫的放射线3D云标签代码支持拖动的云标签(IE不兼容)

【下一篇】

CSS3 transition规范的实际使用经验