在攻防的过程中,渗透环节通常会用到webshell,以asp、php、jsp或者cgi等网页文件形式存在。当黑客在入侵了一个网站后,通常会将asp或php后门文件与网站服务器web目录下正常的网页文件混在一起,然后就可以使用浏览器来访问asp或者php后门,得到一个命令执行环境,以达到控制网站服务器的目的。
webshell的演变历程
webshell的发展大致分为四个阶段:
web服务器管理页面——> 大马——>小马拉大马——>一句话木马——>加密一句话木马——>加密内存马
近年来,在各种攻防演练对抗的开展下,各个厂商对于传统的webshell文件都有了很强的检测模型及检测技术,而内存马却不容易被检测到。传统的Webshell是基于文件类型的,攻击者可以利用上传工具或网站漏洞植入木马,而Webshell内存马是无文件马,利用中间件的进程执行某些恶意代码,不会有文件落地,现在常用来做持久化,规避检测,持续驻留目标服务器。
webshell内存马
Webshell内存马,是在内存中写入恶意后门和木马并执行,达到远程控制Web服务器的一类内存马。
以java为例,客户端发起的web请求会依次经过Listener、Filter、Servlet三个组件,我们只要在这个请求的过程中做手脚,在内存中修改已有的组件或者动态注册一个新的组件,插入恶意的shellcode,就可以达到我们的目的。
内存马分类
内存马的攻击原理
- java内存马原理
JAVA web容器中一个网页请求会由Servlet容器进行调用和执行,Filter程序则是一个实现了特殊接口的Java类,一般用于进行请求过滤。当某一个请求需要对内存中的数据进行读写或者执行时,就需要经过Filter的判断和过滤,由Filter来决定这些请求是否有权限进行这些操作。
而内存马正是利用了这种机制,通过动态注册一个新的Filter或者向Filter中注入恶意的shellcode,让Filter允许攻击者访问到Web服务器内存中的数据。只要拥有了可用的Filter,攻击者就能进行远程攻击,而不管是shellcode的注入过程还是对Web服务器数据进行访问的过程都会在内存中出现异常行为。
当然在Java容器的利用中并不是局限于某个单一组件,除了Filter,在Servlet和Listener的内存进程中也可以加以利用,其大致原理相似。另外,由于Web服务器在网络中与数据库和权限系统连接,攻击者在入侵后,可以更轻易地进行横向的渗透,拿到多个主机的权限。
- php内存马原理
php内存马也就是php不死马是将不死马启动后删除本身,在内存中执行死循环,使管理员无法删除木马文件。
- python内存马原理
Python内存马利用flask框架中ssti注入来实现,flask框架中在web应用模板渲染的过程中用到render_template_string()进行渲染但未对用户传输的代码进行过滤导致用户可以通过注入恶意代码来实现python内存马的注入。
除了常见语言脚本的内存马利用之外,还可以通过像PowerShell、VBS、JavaScript等系统脚本以及常见中间件(Weblogic、Tomcat)等容器框架在其运行进程中加以利用,实现内存马的隐写。
内存马的三大特点
- 1.内存马无逻辑结构边界,难以被发现。内存马仅存在于进程的内存空间中,通常与正常的/合法的代码、数据混淆。内存马与传统恶意代码的不同之处在于它没有磁盘文件,会导致传统的检测防护手段失效。
- 2.内存马缺乏稳定的静态特征,难以被识别。内存马缺乏结构化的静态形式,它依附在进程运行期间的输入数据进入进程,数据可能被加密混淆,因此,无法通过特征识别内存马。
- 3.内存马种类多,检测机制复杂而多样。内存马有二进制代码片段(Shellcode)、PowerShelll脚本、Web中间件等类型,每种类型又可细分,不同类型内存马的执行方式、恶意代码/行为触发机制各不相同。
内存马排查思路
先判断是通过什么方法注入的内存马,可以先查看web日志是否有可疑的web访问日志,如果是filter或者listener类型就会有大量url请求路径相同参数不同的,或者页面不存在但是返回200的,查看是否有类似哥斯拉、冰蝎相同的url请求,哥斯拉和冰蝎的内存马注入流量特征与普通webshell的流量特征基本吻合。通过查找返回200的url路径对比web目录下是否真实存在文件,如不存在大概率为内存马。
如果在web日志中并未发现异常,可以排查是否为中间件漏洞导致代码执行注入内存马,排查中间件的error.log日志查看是否有可疑的报错,根据注入时间和方法根据业务使用的组件排查是否可能存在java代码执行漏洞以及是否存在过webshell,排查框架漏洞、反序列化漏洞。