到这里不由得让我们想起了之前那个RMIBYPASS的场景https://www.veracode.com/blog/research/exploiting-jndi-injections-java ,倒着我们就可以自定义一个RMI服务,将bind的内容设置成我们可以控制的org.apache.wsif.naming.WSIFServiceStubRef类型,就可以到最下面的函数,为什么上面那个org.apache.wsif.naming.WSIFServiceRef不行,因为前面提到了这个类必须要是EJBHOME的实现类,上面的明显不符合要求,下面的是通过动态代理来生成一个指定接口的类,而且接口的类型我们也可以控制,所以接下来就是如何利用wsif服务来进行代码执行了。
这里ctx.lookup里面的jndi的地址可以设置为自定义rmi的服务,具体的RMI服务代码如下
WSIF服务的wsdl描述文件中提供了JavaBind的方式,可以将描述文件中定义的函数(operation name)映射成客户机器中Java类的函数,所以这里我们可以将在wsif描述文件中定义findByPrimaryKey函数以及映射函数的参数和返回类型,这样在最终调用findByPrimaryKey函数的时候会调用到org.apache.wsif.base.WSIFClientProxy#invoke中createOperation函数去进行远程方法调用,客户端在拿到映射后就可以去执行映射类相应的函数了。
这里映射的类和函数是javax.el.ELProcessor类的eval方法,eval函数接受一个String类型的参数映射是符合相应的定义,WSIF对应的XML文件关键片段如下:
这里映射的类和函数是javax.el.ELProcessor类的eval方法,eval函数接受一个String类型的参数映射是符合相应的定义,WSIF对应的XML文件关键片段如下:
且findByPrimaryKey的参数也是我们在WSIFPort_EJB序列化数据中可以控制的,所以最终就导致了RCE。
漏洞利用
最开始在测试Websphere 8.5.5.0的时候,发现有个关键位置
合作咨询:@kittenmicat
漏洞利用
最开始在测试Websphere 8.5.5.0的时候,发现有个关键位置
合作咨询:@kittenmicat
这里要求调用的函数必须是继承接口(EJBHOME)中一个接口,否则程序主动抛异常(Exception in thread “main” java.lang.reflect.UndeclaredThrowableException)EXP就利用失败,这个点遇到的问题卡了我两天左右,最后看到有人复现成功,测试的9版本,所以我就切换到9版本。
在9版本中修复了这个第三方库的BUG,不主动的调用Log,加了if判断,如下
9.0 版本中org.apache.aries.jndi.ObjectFactoryHelper#getObjectInstanceViaContextDotObjectFactories函数的实现
在9版本中修复了这个第三方库的BUG,不主动的调用Log,加了if判断,如下
9.0 版本中org.apache.aries.jndi.ObjectFactoryHelper#getObjectInstanceViaContextDotObjectFactories函数的实现
8.5.5.0 中的org.apache.aries.jndi.ObjectFactoryHelper#getObjectInstanceViaContextDotObjectFactories实现
很明显加了判断,就没这个问题了。
所以8.5.5.0默认情况下有可能打不死(如果不打补丁2013年的那个库之前),9.0.0.2 没问题,其他版本后续慢慢测试。
补个成功截图
所以8.5.5.0默认情况下有可能打不死(如果不打补丁2013年的那个库之前),9.0.0.2 没问题,其他版本后续慢慢测试。
补个成功截图