一、什么是webshell

  1. shell (计算机壳层)
    在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。Shell 编程跟 java、php 编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。
    Linux 的 Shell 种类众多,常见的有:
    Bourne Shell(/usr/bin/sh或/bin/sh)
    Bourne Again Shell(/bin/bash)
    C Shell(/usr/bin/csh)
    K Shell(/usr/bin/ksh)
    Shell for Root(/sbin/sh)

  2. webshell简介
    webshell,顾名思义:web指的是在web服务器上,而shell是用脚本语言编写的脚本程序,

webshell就是就是web的一个管理工具,可以对web服务器进行操作的权限,也叫webadmin。webshell一般是被网站管理员用于网站管理、服务器管理等等一些用途

,但是由于webshell的功能比较强大,可以上传下载文件,查看数据库,甚至可以调用一些服务器上系统的相关命令(比如创建用户,修改删除文件之类的),通常被黑客利用,黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器WEB目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的。

黑客通过一些上传方式,将自己编写的webshell上传到web服务器的页面的目录下,然后通过页面访问的形式进行入侵,或者通过插入一句话连接本地的一些相关工具直接对服务器进行入侵操作。

  1. webshell的分类

webshell根据脚本可以分为PHP脚本木马,ASP脚本木马,也有基于.NET的脚本木马和JSP脚本木马。在国外,还有用python脚本语言写的动态网页,当然也有与之相关的webshell。

根据功能也分为大马与小马

小马通常指的一句话木马

一句话木马短小精悍,而且功能强大,隐蔽性非常好,在入侵中始终扮演着强大的作用。,例如:<%eval request(“pass”)%>通常把这句话写入一个文档里面,然后文件名改成xx.asp。然后传到服务器上面。这里eval方法将request(“pass”)转换成代码执行,request函数的作用是应用外部文件。这相当于一句话木马的客户端配置。工作原理:首先,找到数据库是asp格式的网站,然后,以留言板,或者发表文章的方式,把一句话添加到asp数据库,或者加进asp网页.记住!我们的目的是把一句话<%execute request(“value”)%>添加到数据库,无论任何方式!然后打开客户端(就是你电脑上面的那个htm文件),填上加入了一句话的asp文件,或者是asp网页,然后进入此网站服务器。一句话最常用的客户端为:一句话客户端增强版
中国菜刀;lanker一句话客户端;ZV新型PHP一句话木马客户端GUI版。

大马的工作模式简单的多,他没有客户端与服务端的区别,就是一些脚本大牛直接把一句话木马的服务端整合到了一起,通过上传漏洞将大马上传,然后复制该大马的url地址直接访问,在页面上执行对web服务器的渗透工作。但是有些网站对上传文件做了严格的限制,因为大马的功能较多,所以体积相对较大,很有可能超出了网站上传限制,但是小马的体积可以控制(比如把代码复制很多遍,或者在一个乱码文件中夹入代码),但是小马操作起来比较繁琐,可以先上传小马拿到webshell,然后通过小马的连接上传大马拿到服务器。

二、传统webshell检测
Webshell的运行流程:hacker -> HTTP Protocol -> Web Server -> CGI。简单来看就是这样一个顺序:黑客通过浏览器以HTTP协议访问Web Server上的一个CGI文件。棘手的是,webshell就是一个合法的TCP连接,在TCP/IP的应用层之下没有任何特征(当然不是绝对的),只有在应用层进行检测。黑客入侵服务器,使用webshell,不管是传文件还是改文件,必然有一个文件会包含webshell代码,很容易想到从文件代码入手,这是静态特征检测;webshell运行后,B/S数据通过HTTP交互,HTTP请求/响应中可以找到蛛丝马迹,这是动态特征检测。
目前针对Webshell的特征检测一般是通过特征比对及文件属性异常的静态检测和基于访问情况、行为模式特征的动态检测方式进行查杀,由于窃密型Webshell通常会伪装成正常的WEB脚本文件,静态特征检测及动态行为检测都无法有效的针对此类后门进行检测。

2.1 静态检测
**

静态特征检测是指对脚本文件中所使用的关键词、高危函数、文件修改的时间、文件权限、文件的所有者以及和其它文件的关联性等多个维度的特征进行检 测

,**即先建立一个恶意字符串特征库,例如:“组专用大马|提权|木马|PHP\s?反弹提权cmd执行”,“WScript.Shell、 Shell.Application、Eval()、Excute()、Set Server、Run()、Exec()、ShellExcute()”,同时对WEB文件修改时间,文件权限以及文件所有者等进行确认。通常情况下 WEB文件不会包含上述特征或者特征异常,通过与特征库的比对检索出高危脚本文件。

该检测方法的优点:可快速检测,快速定位;

缺点:容易误报,无法对加密或者经过特殊处理的Webshell文件进行检测。无法查找0day型webshell,而且容易被绕过。尤其是针对窃密型Webshell无法做到准确的检测,因为窃密型Webshell通常具有和正常的WEB脚本文件具有相似的特征。
所以用这样一种思路:强弱特征。即把特征码分为强弱两种特征,强特征命中则必是webshell;弱特征由人工去判断。

2.2 动态检测

动态特征检测通过Webshell运行时使用的系统命令或者网络流量及状态的异常来判断动作的威胁程度,

Webshell通常会被加密从而避免静态 特征的检测,

当Webshell运行时就必须向系统发送系统命令来达到控制系统或者操作数据库的目的,通过检测系统调用来监测甚至拦截系统命令被执行,从 行为模式上深度检测脚本文件的安全性。

先前我们说到过webshell通信是HTTP协议。只要我们把webshell特有的HTTP请求/响应做成特征库,加到IDS里面去检测所有的HTTP请求就好了。webshell起来如果执行系统命令的话,会有进程。Linux下就是nobody用户起了bash,Win下就是IIS User启动cmd,这些都是动态特征。再者如果黑客反向连接的话,那很更容易检测了,Agent和IDS都可以抓现行。Webshell总有一个HTTP请求,如果我在网络层监控HTTP,并且检测到有人访问了一个从没反问过得文件,而且返回了200,则很容易定位到webshell,这便是http异常模型检测,就和检测文件变化一样,如果非管理员新增文件,则说明被人入侵了。

优点:可用于网站集群,对新型变种脚本有一定的检测能力。

缺点:针对特定用途的后门较难检测,实施难度较大。

2.3日志分析
使用Webshell一般不会在系统日志中留下记录,但是会在网站的web日志中留下Webshell页面的访问数据和数据提交记录。日志分析检测 技术通过大量的日志文件建立请求模型从而检测出异常文件,称之为:HTTP异常请求模型检测。例如:一个平时是GET的请求突然有了POST请求并且返回 代码为200、某个页面的访问者IP、访问时间具有规律性等。
使用Webshell一般不会在系统日志中留下记录,但是会在网站的web日志中留下Webshell页面的访问数据和数据提交记录。日志分析检测技术通过大量的日志文件建立请求模型从而检测出异常文件,称之为:HTTP异常请求模型检测。例如:一个平时是GET的请求突然有了POST请求并且返回代码为200、某个页面的访问者IP、访问时间具有规律性等。

webshell的访问特征(主要特征)

少量ip对其发起访问
总的访问次数少
该页面属于孤立页面
当然不是所有的孤立页面都是webshell,以下情况也会造成孤立页面
(1)隐藏管理后台等正常孤立页面的访问
(2)扫描器行为,常见漏洞扫描,PoC扫描,Webshell扫描(日志中经常可以看到常见webshell路径加一句话payload的扫描)——这是最主要的干扰数据,需要剔除
对于情况(1)采用白名单的方式,对于情况(2)扫描器识别
(p.s. 爬虫技术、指纹识别技术、扫描器识别(广义的可衍生到人机识别)可以称为web安全技术的三驾马车,总也绕不过去)

优点:采用了一定数据分析的方式,网站的访问量达到一定量级时这种检测方法的结果具有较大参考价值。

缺点:存在一定误报,对于大量的访问日志,检测工具的处理能力和效率会比较低。

2.4统计学
在Webshell后门检测中被使用较为广泛的一种方法是统计学方法,NeoPi是国外流行的一个基于统计学的Webshell后门检测工具,它使用五种计学方法在脚本文件中搜索潜在的被混淆或被编码的恶意代码。

NeoPi使用以下五种检测方法:

1、信息熵(Entropy):通过使用ASCII码表来衡量文件的不确定性;

2、最长单词(LongestWord):最长的字符串也许潜在的被编码或被混淆;

3、重合指数(Indexof Coincidence):低重合指数预示文件代码潜在的被加密或被混效过;

4、特征(Signature):在文件中搜索已知的恶意代码字符串片段;

5、压缩(Compression):对比文件的压缩比。

采用这种检测方法也存在明显的弱点,NeoPi的检测重心在于识别混淆代码,它常常在识别模糊代码或者混淆编排的木马方面表现良好。未经模糊处理的 代码对于NeoPi的检测机制较为透明。如果代码整合于系统中的其它脚本之上,这种“正常”的文件极可能无法被NeoPi识别出来。

小结:传统检测方法的缺陷
现有技术是针对普通的脚本后门、以控制服务器为目的、通常包含较为明显的静态特征或者行为模式,不能对窃密型后门进行有效检测。

由于业务系统更新频繁,WEB脚本文件相关的属性经常发生变化所以偏重于文件属性检测的方法往往会产生更多的误报,基于动态行为检测的方法往往技术 难度较大,难以实现,而且对系统造成的性能影响较大,甚至可能对系统稳定性造成影响,基于日志的检测方法,一方面,由于业务功能较多且复杂,部分功能可能 很少会被用到,其日志访问可能会命中某些检测规则从而造成更多的误报,另一方面,大量的日志记录处理起来会对服务器性能产生负担、而且由于日志量巨大检测 过程消耗时间长,检测速度较慢。而窃密型Webshell后门往往会模拟正常的数据库操作、不具有较为明显静态特殊属性、被访问的次数比较少无法形成较为 明显的访问特征,通过日志分析也很难发现。

5.6 语法检测
语法语义分析形式,是根据php语言扫描编译的实现方式,进行剥离代码、注释,分析变量、函数、字符串、语言结构的分析方式,来实现关键危险函数的捕捉方式。这样可以完美解决漏报的情况。但误报上,仍存在问题。误报问题所在,一是被检测文件是否为合法php语法文件,token_get_all函数的实现,是不验证是否问合法php语法文件的,只是对其进行扫描,分析。服务器云判断是一种根据恶意代码串的指纹,根据大量后门数据,做语法、语义分析,做业务逻辑分析,理解这段代码的用途,给出其是否为恶意代码的定位,而其他使用者,直接可以得到该代码片段是否为恶意代码的结果反馈。Pecker Scanner首先是基于语法分析,剥离token、注释、字符串、变量、语言结构,再进行php语法检测,提取恶意代码的扫描工具,来解决漏报问题。同时支持服务器云判断,尽量避免误报问题。基于语法的pecker检测工具

三、新型webshell检测
31基于数据库操作审计的检测方式
针对窃密型Webshell必须具有操作数据库的能力,可以引申出一种新的检测方法,通过分析正常WEB脚本文件和窃密型Webshell对数据库操作的差异进行分析是本检测方法所重点研究的方向。

正常情况下WEB站点进行数据操作的过程应该是重复性且较为复杂的查询过程,这种查询通常精确度非常高,查询过程不会出现类似于“select * from”这种查询语句。正常的WEB脚本在进行数据库操作的过程中也不会出现跨越数据库查询的情况,一旦出现这种现象基本可以判断为非正常的WEB脚本 操作过程。

就以上思路设计如下的检测方案:

审计数据操作记录。通过审计数据库操作记录可以单独的为每一个WEB站点甚至WEB站点中的每一个脚步文件建立查询请求模型,通过几天甚至数月的自 我学习过程来学习并维护一份查询请求数据库。该数据库的内容包含了每次查询操作的详细信息、请求归类和分析结果。并且建立动态查询请求规则,Agent一 旦检测到违反该规则的查询请求后会向Server端传递相关信息,Server端再结合其它的扫描过程综合判断发起请求的文件是否为Webshell,并 最终决定是否向管理员报警。

3.2建立机器学习日志分析系统
由于数据库操作记录日志量非常大,使用人工的方法难以进行精确筛选和审计。所以需要建立一套机器自学习的日志审计系统。该日志审计系统主要基于查询模型白名单学习与数学统计模型这两方面进行设计。

查询模型白名单学习系统:

在一个网站系统中,由于系统业务逻辑相对固定,执行的数据库查询语句可以归类并且是可预测的,基于这些事实可以建立一套自学习系统,在无人值守的状 态下进行无监督的机器学习。在对日志进行泛化处理之后,根据特征(包括时间,查询语句,参数等)建立N维的特征向量。使用k-均值聚类算法对日志进行初步 分组。其中对参数的处理使用局部加权线性回归算法预测参数类型。对聚类后的数据进行抽样,使用贝叶斯决策树进行抽样结果的机器决策。

数学统计模型系统:

由于窃密型web应用脚本后门只服务于入侵者,所执行的查询语句也是超出业务系统正常使用逻辑的,在一个有一定访问量级的业务系统中,窃密使用的查询语句是执行量最少的。对业务系统数据库的日志进行参数归一化处理后,正常应用中的查询语句与窃密使用的语句从数量上来看一定有数量级的差距。可以建立查询语句的统计模型,也可以对窃密型Webshell行为进行审计。

变形、窃密型webshell检测
变形webshell可以由上面所说的统计学NeoPI工具检测,也可以动态检测。比如,一个正常的程序员如果使用eval、system是不会刻意的转换隐藏的,如果发现某个函数执行了,代码中却找不到这个函数名,我们认为这是一个异常行为。所以变形加密也可以用这种方式查找,在日志中找到某个文件执行system等命令,但在原文件中没找到这个文件代码,说明文件是后门文件。

针对窃密型Webshell必须具有操作数据库的能力,可以引申出一种新的检测方法,通过分析正常WEB脚本文件和窃密型Webshell对数据库操作的差异进行分析是本检测方法所重点研究的方向。正常情况下WEB站点进行数据操作的过程应该是重复性且较为复杂的查询过程,这种查询通常精确度非常高,查询过程不会出现类似于“select * from”这种查询语句。正常的WEB脚本在进行数据库操作的过程中也不会出现跨越数据库查询的情况,一旦出现这种现象基本可以判断为非正常的WEB脚本操作过程。

就以上思路设计如下的检测方案:

审计数据操作记录。通过审计数据库操作记录可以单独的为每一个WEB站点甚至WEB站点中的每一个脚步文件建立查询请求模型,通过几天甚至数月的自我学习过程来学习并维护一份查询请求数据库。该数据库的内容包含了每次查询操作的详细信息、请求归类和分析结果。并且建立动态查询请求规则,Agent一旦检测到违反该规则的查询请求后会向Server端传递相关信息,Server端再结合其它的扫描过程综合判断发起请求的文件是否为Webshell,并最终决定是否向管理员报警。

作者:JackyTsuuuy
链接:https://www.jianshu.com/p/02aac12e459f
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

作者:JackyTsuuuy
转自:https://www.jianshu.com/p/02aac12e459f

参考:四款webshell扫描工具对比
https://www.jianshu.com/p/77b1533b15d6