FindShell

内存马查杀工具
授权协议 Apache-2.0
开发语言 Java
所属分类 管理和监控、 漏洞检测扫描和评估
软件类型 开源软件
地区 国产
投 递 者 江同化
操作系统 跨平台
开源组织
适用人群 未知
 软件概览

FindShell 是一个自动的内存马查杀工具,可以用于普通内存马和Java Agent内存马。

尤其针对难以查杀的Java Agent型内存马,例如冰蝎等主流工具的内存马都是Java Agent

主要分为以下四步:

  • 利用JDK提供的sa-jdiAPI基于黑名单dump存在于JVM真正的字节码
  • 这种字节码在很多情况下是非法的,所以我修改了ASM源码以分析非法字节码
  • 基于ASM做普通的分析和模拟栈帧做深入的分析
  • 如果发现内存马将会尝试自动修复目标(利用Java Agent动态恢复原始字节码)

检测

基本检测:java -jar FindShell.jar --pid [目标JVM的PID]

这个pid的获取方式可以通过jps命令找到你需要的目标JVMpid

这种情况下默认必检测的类有以下四个(最常见的Java Agent内存马出现的地方)

类名 方法名
javax/servlet/http/HttpServlet service
org/apache/catalina/core/ApplicationFilterChain doFilter
org/springframework/web/servlet/DispatcherServlet doService
org/apache/tomcat/websocket/server/WsFilter doFilter

并对以下的黑名单类进行检测(如果类名出现关键字则dump并分析该类字节码)

keyword.add("shell");
keyword.add("memshell");
keyword.add("agentshell");
keyword.add("exploit");
keyword.add("payload");
keyword.add("rebeyond");
keyword.add("metasploit");

注意:

  • 修改org.sec.Constant代码可以自定义黑名单和关键字
  • 加入--debug参数保留从JVMdump出的字节码供自行分析
  • 并不是所有类的字节码都可以dump成功,但常见的这些类测试中没问题

修复

目前仅做了Java Agent内存马的自动修复,支持最常见的HttpServletApplicationFilterChain

检测和修复:java -jar FindShell.jar --pid [PID] --repair

根目录存在一个RepairAgent.jar文件,这不属于该项目,但我将代码放在org.sec.repair包中供参考

注意:修复手段仅靶机测试成功,在真实环境中使用请慎重

原理

  • 为什么不直接用Java AgentAlibaba Arthas工具对JVM当前字节码进行dump

Java Agent内存马是调用redefineClass方法对字节码进行修改的。而调用retransformClass方法的时候参数中的字节码并不是调用redefineClass后被修改的类的字节码。对于冰蝎来讲,根本无法获取被冰蝎修改后类的字节码。我们自己写Java Agent清除内存马的时候,同样也是无法获取到被redefineClass修改后的字节码,只能获取到被retransformClass修改后的字节码。通过JavaassistASM工具获取到类的字节码,也只是读取磁盘上响应类的字节码,而不是JVM中的字节码

  • 那么怎样获得存在于JVM真正的字节码

之前有宽字节安全的师傅提到利用sa-jdi工具对真正的当前字节码进行dump后反编译结合人工分析,该工具也是基于JDK自带的sa-jdi库实现的,不过加入了一些过滤的选项

  • 什么情况下这样的字节码为什么是非法的

当目标类存在lambda表达式的时候会导致非法字节码,具体可以参考我的文章

  • 修改了哪些源码以解析非法字节码

参考连接:修改源码说明

  • 为什么要结合普通字节码分析和模拟栈帧分析两种呢

因为Runtime.exec这种调用很不常见且过程简单,用普通的字节码分析即可解决。但是冰蝎的反射调用defineClass并反射invoke以实现代码执行效果的方式,过程比较复杂,且反射调用是程序中的常见功能,简单的分析会导致误报

  • 什么是模拟栈帧分析

参考文章:详解Java自动代码审计工具实现  基于污点分析的JSP Webshell检测

免责声明

工具仅用于安全研究以,由于使用该工具造成的任何后果使用者负责

  • shell脚本之find ​ 实时查找工具,通过遍历指定路径下的文件系统完成文件查找。 ​ find命令的工作方式如下:沿着文件层次结构向下遍历,匹配符合条件的文件,执行响应的操作。 语法:find [options]… [查找条件][处理动作] ​ 查找路径:指定具体的目标路径,默认为当前目录。 ​ 查找条件:指定的查找标准,可以是文件名、大小、类型、权限等,默认为找出指定路径下的所有文件。 根

  • find命令的一般格式:     find pathname -options [-exec]     pathname  是find命令所查找的目录路径     -exec     对匹配的文件执行该参数所给出的shell命令    -options 选项参数:     -name 按照文件名查找文件     -perm 按照文件权限来查找文件     -user 按照文件属主来查找文件    

  • FinalShell连接虚拟机(Ubuntu)(csdn)

 相关资料
  • 一、本功能说明 本节提供了对整个网站的扫描并和镜像进行对比,以便找出非法文件 二、子功能导航 1.生成nd5 2.木马查杀 3.功能演示 4.查杀报告 三、功能详解 1.生成MD5 1).如何进入本功能 导航栏 选择扩展 -> 菜单栏 选择木马查杀 -> 生成MD5 稍等片刻即可完成 注意事项:   在生成MD5镜像之前强烈建议您确保当前的文件未被恶意修改或者嵌入了木马文件! 2.木马查杀 镜像生

  • used_memory:859192数据结构的空间 used_memory_rss:7634944实占空间 mem_fragmentation_ratio:8.89前2者的比例,1.N为佳,如果此值过大,说明redis的内存的碎片化严重,可以导出再导入一次.

  • script/下的memstat.sh或者ps_mem.py都可以查看系统的内存情况,两个工具都需要root权限。

  • #!/bin/bash # Get current swap usage for all running processes # Erik Ljungstrom 27/05/2011 # Modified by Mikko Rantalainen 2012-08-09 # Pipe the output to "sort -nk3" to get sorted output # Modified

  • 我使用1Gi内存设置将filebeat作为守护程序集运行。我的播客崩溃,状态为“OOMKilled”。 这是我的限制设置 运行filebeat的推荐内存设置是什么? 谢谢

  • /redis/script/redis-sampler.rb 127.0.0.1 6379 0 10000 /redis/script/redis-audit.rb 127.0.0.1 6379 0 10000