几点基于Web日志的Webshell检测思路
来自: http://my.oschina.net/bluefly/blog/626132
1 Web日志与Webshell的关联
Web日志是 Web 服务器(如IIS、Apache)记录用户访问行为产生的文件,标准的 Web 日志是纯文本格式,每行一条记录,对应客户端浏览器对服务器资源的一次访问典型的日志包括来源地址、访问日期、访问时间、访问 URL 等丰富的信息,对日志数据进行分析,不仅可以检测到可疑的漏洞攻击行为,还可以提取特定时间段特定 IP 对应用的访问行为。
Web日志的格式虽略有不同,但记录的内容基本一致。这里以IIS服务器下W3C格式的日志为例,如图1。
图1 日志示例
本文实验数据来自一台曾被入侵的IIS服务器脱敏后的日志文件,日志时间范围为2013年6月-2014年6月,该服务器采用W3C日志格式,默认记录字段如图2。
图2 日志文件实例
各字段说明如下。
date:发出请求时候的日期。
time:发出请求时候的时间。
s-sitename:服务名,记录当记录事件运行于客户端上的Internet服务的名称和实例的编号。
s-ip:服务器的IP地址。
cs-method:请求中使用的HTTP方法,GET/POST。
cs-uri-stem:URI资源,记录做为操作目标的统一资源标识符(URI),即访问的页面文件。
cs-uri-query:URI查询,记录客户尝试执行的查询,只有动态页面需要URI查询,如果有则记录,没有则以连接符-表示。即访问网址的附带参数。
s-port:为服务配置的服务器端口号。
cs-username:用户名,访问服务器的已经过验证用户的名称,匿名用户用连接符-表示。
c-ip:客户端IP地址。
cs(User-Agent):用户代理,客户端浏览器、操作系统等情况。
sc-status:协议状态,记录HTTP状态代码,200表示成功,403表示没有权限,404表示找不到该页面,具体说明在下面。
sc-substatus:协议子状态,记录HTTP子状态代码。
sc-win32-status:Win32状态,记录Windows状态代码。
通过Web日志,我们可以知道在某一个时刻,某个访客访问了服务器的某个文件。经过分析,Webshell的访问特征通常包括特征文件名、特征参数、访问频率、是否为孤立页面等。说明如表1所示。
上述特征皆可通过对Web日志条目进行特征匹配和访问频率统计得到。
2 检测思路的提出
本文对基于Web日志的Webshell检测思路如下,在对日志文件进行预处理后,分别对日志记录进行文本特征匹配、统计特征计算与文件关联性分析,最后对检测结果汇总,列出疑似的Webshell文件。
2.1日志预处理
基于检测Webshell的目的,需要对原始的Web日志记录进行提取、分解、过滤、删除和合并,再转化成适合进行程序处理的格式。
日志预处理的步骤如下,
1) 数据清理
首先,由于Webshell通常为脚本页面,因此可删除静态的网站文件访问记录,如文件后缀为html、jpg、ico、css、js等,但需要注意,当网站存在文件包含漏洞或服务器解析漏洞的时候,需要注意异常文件名或URL,如“bg.asp:.jpg”和“/databackup/1.asp/imges/page_1.html”,此类文件名或URL也能具备Webshell功能,因此需对此种情况建立特征库进行排除。
其次,删除日志记录的多余字段,包括空字段以及和Webshell访问无关的字段,比如s-sitename、sc-substatus和sc-win32-status。
最后,需要删除用户访问失败的记录,比如sc-status字段值为404,表示该文件不存在,此条记录可以删除,尽可能多得排除冗余日志记录。
2) 访客识别
访客识别的目的是从每条日志记录里把访客和被访问页面关联起来,通常情况下可以通过cs-username、c-ip和cs(User-Agent)标识一个访客,网站未设置登录功能时,可以采用IP和User-Agent来标识一个访客。初步分析时,可以认为不同的IP地址代表不同的用户,其次,在NAT(Network Address Translation,网络地址转换)技术普遍应用的情况下,同一IP下可能存在多个用户,这个时候可以结合User-Agent进行判断,User-Agent通常会因为操作系统版本和浏览器版本而有所变化。如果IP地址和User-Agent都一样,也可以通过分析页面访问的规律来分析是否存在多个访客。在访客识别中,可以注意识别网络爬虫程序,如cs(User-Agent)字段为“Baiduspider”,可以认为是百度爬虫,在Webshell的检测中,这里日志记录可以排除。
3) 会话识别
会话(session)识别的目的是为了分析访客在浏览站点期间的一系列活动,比如访客首先访问了什么页面,其次访问了什么页面,在某个页面提交了某个参数。通过分析多个用户的访问序列和页面停留时间,可以从日志中统计页面的访问频率和判断孤立页面。
2.2文本特征匹配
通过本地搭建服务器环境,对大量Webshell页面进行访问测试和记录,建立Web日志的文本特征库
在所有文本信息中,主要提取Webshell在Web日志访问中的URI资源(对应字段cs-uri-stem)特征和URI查询(对应字段cs-uri-query)特征。特征示例如表2。
为了提高匹配覆盖率,通常将一类静态特征归纳成正则表达式的方式进行匹配,例如正则表达式“[0-9]{1,5}\.asp”表示匹配文件名为一到五位阿拉伯数字的后缀为asp的文件。
除了基本的特征库的检测,为提高Webshell文件的覆盖面和对未知Webshell 的检测能力,可采用支持向量机(Support Vector Machine,SVM)机器学习算法,通过对正常网站文件的访问特征集和Webshell文件访问特征集进行训练,来提高从Web日志中检测Webshell的能力。
2.3基于统计特征的异常文件检测
在统计特征中,主要考虑网页文件的访问频率,访问频率指的是一个网页文件在单位时间内的访问次数,通常正常的网站页面由于向访客提供服务因此受众较广,所以访问频率相对较高。而Webshell是由攻击者植入,通常只有攻击者清楚访问路径,因此访问频率相对较低。
值得注意的是,网站开始运营时就会存在一定数量的正常页面,而Webshell通常在一段时间后才会出现,因此统计和计算页面访问频率的时候,针对某一页面,要采用该页面第一次被访问到最后一次被访问的时间段作为统计区间,然后计算单位时间内的访问次数,得到访问频率。需要说明的是,单凭访问频率特征,只能找出异常文件,无法确定一定是Webshell,一些正常页面的访问频率也会较低,比如后台管理页面或者网站建设初期技术人员留下的测试页面访问频率也较低。
这里用f(A) 表示计算后的网站页面A的访问频率,Tfirst(A)表示网站页面A首次被访问的时间,Tend(A) 表示网站页面A最后一次被访问的时间,COUNTFE(A)表示网站页面A在时间Tfirst(A)到Tend(A)期间的被访问次数。
因此,网站页面A的访问频率计算如下,
时间单位可根据需要选择小时、天、星期、月等。
2.4基于文件出入度的文件关联性检测
文件关联性主要是指网页文件之间是否有交互,即是否通过超链接关联起来引导用户访问。而孤立文件通常是指没有与其他页面存在交互的页面,一个网页文件的入度衡量的是访客是否从其他页面跳转到该页面,同理,一个网页文件的出度衡量的是访客是否会从该页面跳转到其他页面。正常网站页面会互相链接,因此会有一定的出入度,而Webshell通常与其他网站页面没有超链接,通常出入度为0。
需要注意的是,什么是孤立,与其他页面的交互度为多少算孤立,都是相对的。而且,有的Webshell也会有一定的出入度,比如当Webshell采用超链接列出网站目录中的文件的时候,就会产生与其他页面的交互。当需要多个脚本协同作用的Webshell 也会产生交互。同样,单凭文件出入度特征,只能找出异常文件,无法确定一定是Webshell,一些正常页面的出入度也会较低,比如特意隐藏的独立后台管理页面或者网站建设初期技术人员留下的独立测试页面出入度也较低。
网页文件相互链接示意图如图3所示。
图3网页文件链接示意
如上例所示,本文对上述网页文件出入度的统计如下,
index.asp:出度为2,入度为1;
Article_Show.asp:出度为1,入度为1;
Photo_View.asp:出度为0,入度为1;
test.asp:出度为0,入度为0 ,判断为孤立文件。
3 检测方法可行性验证
本文的重点在于提出一种从Web日志中检测Webshell的思路,找出可行的检测方法。本章节通过对实际的被入侵站点的日志记录进行分析,通过对比正常网页文件与Webshell在文本特征、统计特征和文件关联性特征,对第2章节提出的检测方法进行可行性验证。
首先要考虑的是对照组的设置,也就是正常文件组和Webshell文件组的选取,本文实验数据来自一台曾被入侵的IIS服务器脱敏后的日志文件与Web目录文件。首先采用基于本地文件特征的Webshell查杀工具“D盾Webshell查杀工具”,对测试的Web目录文件进行检测,检测结果如图5所示。
图5 D盾查杀结果
在“D盾Webshell查杀工具”检测结果的基础上,结合人工判断,最终选取10个确定的Webshell文件作为Webshell文件组。
然后对正常网页文件,根据对网站目录的分析,基于涵盖不同目录深度和页面功能的考虑下,人工选取10个文件作为正常文件组。
正常文件组和Webshell文件组选取情况如表3所示。
3.1文本特征对比
分别统计正常文件组和Webshell文件组的URI资源(对应字段cs-uri-stem)特征和URI查询(对应字段cs-uri-query)特征,看是否有较为明显的区别。如表4所示。
由上图可以知道,Webshell文件和正常网页文件在日志中的访问特征有较为明显的区别,采用模式匹配和机器学习的方式进行分类检测思路可行,且便于实施。
3.2统计特征计算和对比
分别统计正常文件组和Webshell文件组的访问频率,看是否有较为明显的区别。如表5所示。
通过对实验数据进行分析,可得出如下结论。
1) 在目录深度一致,和起始时间段较长的情况下(以大于30天为判断依据),正常网页文件的访问频率明显高于Webshell文件。
2) 目录深度较高的正常网页文件,/bbs/zW7/index.asp在三级目录下,访问频率也会较低,因此判断是否为Webshell文件时,要把访问频率和目录深度结合起来进行考虑。
3) 单从Webshell文件的访问频率来看,有的数据特征呈现访问频率较高,仔细分析日志发现,该类Webshell往往是被攻击者当做一次性后门使用,起始阶段只有1天,而且访客单一,且有时攻击者会对自己上传的Webshell文件进行自动化的利用和扫描,导致较短时间内出现大量访问行为,呈现高频访问特征,如bg.asp;.jpg。在这种情况下,仅凭借访问频率难以判断。经过分析和思考,为了准确判断此类Webshell,需要再结合文件的起始时间段和单位时间的独立访客数进行综合判断,当某个网页文件的呈现起始时间段较短,单位时间独立访客数较少的特征时,可首先判定为异常文件,再结合访问频率进行分析。这样便能有效解决误报问题。
通过测试数据可以看出,在基于Web日志进行Webshell检测的过程中,单凭网页文件访问频率特征,误报率较高。需要结合网页文件目录深度、起始时间段和单位时间独立访客数等特征进行综合判断。而这3类特征,也可从Web日志中轻易得到。
综上所述,基于访问频率计算与网页文件目录深度、起始时间段和单位时间独立访客数等特征相结合的Webshell检测方法可行。
3.3页面关联性分析对比
分别统计正常文件组和Webshell文件组文件是否能从Web日志中发现多次出现的访问序列,访问序列反应当前页面与网站其他页面的关联性,若无,则判断为孤立文件。如表6所示。
实验数据显示,正常网页文件通常存在互相关联,而Webshell文件通常不存在文件之前的关联,关联性区分明显。原因是正常网页文件处于网站架构设计会互相设置超链接,而Webshell文件往往是攻击者通过网站漏洞直接上传或者通过已存在的Webshell上传到站点目录下的。
而通过对Web日志进行分析发现,Web日志中保留了曾经存在过但是之后被删除的Webshell的访问记录,使得通过Web日志检测Webshell文件更加全面,弥补了本地Webshell文件检测无法追溯历史攻击的不足。
综上说述,通过从Web日志中分析页面关联性来检测异常文件或Webshell的方法可行。