从零开始的内存马分析——如何骑马反杀(二)
字数 1134 2025-08-06 20:12:41
从零开始的内存马分析——如何骑马反杀(二)
1. 内存马提取后的分析准备
1.1 分析环境搭建
- 隔离环境:使用虚拟机或专用分析机器,确保与生产环境隔离
- 工具准备:
- 反编译工具(JD-GUI、JADX、FernFlower)
- 动态分析工具(Burp Suite、Wireshark)
- 调试工具(JDB、IDEA Remote Debug)
- 内存分析工具(VisualVM、Eclipse MAT)
1.2 流量模拟注意事项
- 流量捕获:使用Wireshark或tcpdump捕获原始流量
- 流量清洗:去除敏感信息(认证凭证、个人数据)
- 协议分析:确定通信协议(HTTP/HTTPS/RMI等)
2. 内存马运行逻辑分析
2.1 静态分析
- 反编译字节码:
jadx -d output_dir memory_malware.jar - 关键类识别:
- 查找Filter/Servlet/Controller等Web组件
- 分析动态类加载逻辑(ClassLoader相关代码)
- 查找命令执行相关类(Runtime.exec(), ProcessBuilder)
2.2 动态行为分析
-
HTTP请求处理流程:
- 检查内存马如何拦截请求
- 分析参数解析逻辑(GET/POST参数、Headers)
- 跟踪响应修改逻辑
-
命令执行路径:
// 典型的内存马命令执行代码段 String cmd = request.getParameter("cmd"); Process p = Runtime.getRuntime().exec(cmd); // 读取执行结果并返回
2.3 持久化机制分析
-
注册位置:
- Servlet容器动态注册
- Filter链插入
- Spring Controller注册
-
自保护机制:
- 反卸载逻辑
- 心跳检测
- 多副本互备
3. 安全分析技巧
3.1 动态调试技巧
-
远程调试配置:
java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar app.jar -
关键断点设置:
- 类加载点(ClassLoader.defineClass)
- 命令执行点(Runtime.exec)
- HTTP请求处理入口
3.2 内存分析技巧
-
堆转储分析:
jmap -dump:live,format=b,file=heap.hprof <pid> -
查找恶意组件:
- 搜索非常规类名
- 分析动态生成的类
- 跟踪可疑的引用链
4. 反制措施
4.1 内存马清除
-
手工清除步骤:
- 定位恶意组件内存地址
- 通过反射调用注销方法
- 清理相关引用
-
工具辅助清除:
// 示例:通过反射移除Filter Field filtersField = applicationContext.getClass().getDeclaredField("filters"); filtersField.setAccessible(true); List<Filter> filters = (List<Filter>) filtersField.get(applicationContext); // 移除恶意Filter
4.2 防护措施
-
运行时防护:
- 部署RASP(Runtime Application Self-Protection)
- 启用安全管理器
- 限制反射调用
-
检测方案:
- 定期内存扫描
- 行为监控(异常类加载、命令执行)
- 流量审计(异常请求模式)
5. 分析报告编写要点
-
技术细节:
- 内存马注入方式
- 触发条件
- 影响范围
-
IoC(失陷指标):
- 特征字符串
- 网络通信特征
- 内存特征
-
修复建议:
- 短期缓解措施
- 长期加固方案
- 监控策略调整
附录:常用命令速查
-
查找JVM加载的类:
jcmd <pid> VM.classes -
查看HTTP请求处理链:
jstack <pid> | grep -A 10 'FilterChain' -
动态类加载监控:
-verbose:class
通过以上系统化的分析方法,可以有效解剖内存马的运行机制,为防御和反制提供可靠依据。