Windows Java Usage Tracker本地提权漏洞分析(CVE-2018-3211)

前言

近期,我们发现了一个Java Usage Tracker中的设计缺陷,可导致攻击者创建任意文件,注入指定参数,并实现本地权限提升。反之,该漏洞可以用于权限提升,从而使攻击者可以访问受漏洞影响系统中的资源,这些资源通常受到保护,或仅限于特定应用程序或用户才有权访问。

我们通过Zero Day Initiative,与Oracle合作修复了这一漏洞,该漏洞已经在Oracle的2018年10月更新中实现修复。因此,需要敦促个人用户及企业尽快更新他们的Java版本。

在本文中,我们将深入研究这一漏洞在Windows上的出现原因、Java Usage Tracker的工作原理以及实现漏洞利用所必要的条件。

Oracle安全更新公告: https://www.oracle.com/technetwork/security-advisory/cpuoct2018-4428296.html 。

Java Usage Tracker

在Java中,有一个名为JavaUsage Tracker的功能,用于跟踪系统中Java的使用方式。Java Usage Tracker具有以下功能:

1、通过启动配置参数,记录有关Java虚拟机(JVM)的日志信息。
2、将数据转储到日志文件中,或将其重定向到UDP服务器。
3、允许Usage Tracker配置中指定自定义属性的日志值。

Java Usage Tracker的配置文件名称为usagetracker.properties。该文件位于全局默认位置,这一位置根据操作系统的不同而有所不同。例如,Windows的默认路径是%ProgramData%/Oracle/Java/。全局默认路径中的usagetracker文件将跟踪系统中所有启动的JVM的使用情况。

下图展示了一个usagetracker.properties的样例:

Windows Java Usage Tracker本地提权漏洞分析(CVE-2018-3211)

在上图的第9行中,我们可以看到,JavaUsage Tracker会将日志信息记录到文件global_javatracker.log中。以安装Apache Tomcat(基于Java的开源工具)的系统为例,重新启动服务后,将创建文件global_javatracker.log,并在其中写入Java使用情况跟踪数据。每次,在Tomcat服务启动时,都会向该日志文件中写入新的跟踪信息。

下图是跟踪数据的示例,请注意这里是如何使用逗号分隔两个不同值的,是在属性文件(分隔符配置)中定义。

Windows Java Usage Tracker本地提权漏洞分析(CVE-2018-3211)

用户控制的参数

在文件usagetracker.properties中,有两个属性控制Java Usage Tracker的行为,分别是:

oracle.usagetracker.logToFile
oracle.usagetracker.additionalProperties

logTofile属性允许用户选择系统中的任意路径来保存日志文件。需要注意的是,日志文件是由被监控的JVM创建的。如果JVM以提升后的权限运行,那么JVM就能够在系统的任何地方创建该文件,文件的扩展名也不受控制(也就是说,可以创建名为global_javatracker.bat的日志文件)。

尽管logToFile路径可以任意设置,但无法控制文件内容。因为JVM只会从现有的数据(无法修改)中写入值。然而,Java Usage Tracker具有从自定义属性获取值的特殊功能。 additionalProperties可以包含要跟踪的任意和其他自定义属性,如下所示。

如何通过additionalProperties添加自定义属性:

Windows Java Usage Tracker本地提权漏洞分析(CVE-2018-3211)

重新启动Tomcat服务后,如何跟踪数据的代码段:

Windows Java Usage Tracker本地提权漏洞分析(CVE-2018-3211)

如上图所示,该行的末尾附加了一个带有null值的已配置跟踪属性com.anotherInterestingProperty= null。其值为null,表明该属性不存在。有两种方法可以控制Java Usage Tracker的行为:设置任意日志路径,或者设置任意自定义属性。目前,这个功能似乎是不能被利用的,但是如果结合了其他安全漏洞,就能够被攻击者利用。

借助自定义属性实现漏洞利用

下面,我们详细说明如何借助自定义属性实现漏洞利用。先前配置文件中的第9行会使得Java Usage Tracker强制创建.bat文件,然后添加自定义属性ping 172.0.1.1 >。其生成了文件global_javatracker.bat,如下图所示。

global_javatracker.bat中自定义属性:

Windows Java Usage Tracker本地提权漏洞分析(CVE-2018-3211)

global_javatracker.bat正在被执行:

Windows Java Usage Tracker本地提权漏洞分析(CVE-2018-3211)

在这里,需要注意附加属性ping 172.0.1.1 >= null。当我们执行批处理文件global_javatracker.bat时,会显示错误消息“VM start”无法识别。发生此错误的原因在于,Java Usage Tracker的属性文件仅生成一行,并且其分隔符是根据配置中的com.oracle.usagetracker.separator=, 来决定的,使用了逗号作为分隔符。

那么,如果将分隔符更改为“new line”(新的一行),将会生成完全不同的跟踪日志。

带有“new line”分隔符的JavaUsage Tracker:

Windows Java Usage Tracker本地提权漏洞分析(CVE-2018-3211)

使用“new line”分隔符后,生成的跟踪日志: Windows Java Usage Tracker本地提权漏洞分析(CVE-2018-3211)

上图中的最后一行,包含ping 172.0.1.1 >= null。如果运行global_javatracker.bat,那么就会导致执行ping172.0.1.1> = null命令。但是,由于带有双引号,所以该命令无法识别。但是,我们还有机会执行该命令,因为每个属性值的双引号,可以通过修改另一个配置com.oracle.usagetracker.quote =”来实现替换。

举例来说,我们创建一个内容为空的com.oracle.usagetracker.quote配置,如下图所示。

内容为空的com.oracle.usagetracker.quote:

Windows Java Usage Tracker本地提权漏洞分析(CVE-2018-3211)

使用空配置从com.oracle.usagetracker.quote生成的跟踪日志:

Windows Java Usage Tracker本地提权漏洞分析(CVE-2018-3211)

运行global_javatracker.bat,将会执行命令ping 172.0.1.1> = null。如上图中命令提示符最后的提示所示,创建了一个“null”文件。

至此,我们可以利用Java Usage Tracker实现以下操作:

1、 在文件系统的任意位置创建文件。
2、创建脚本文件,尽管我们在示例中创建了批处理文件,但实际上也可用于创建其他类型的文件。
3、注入任意命令(或与脚本文件相关的任何其他文本)。

攻击者可以在系统的任意位置执行或创建上述内容,或可编写脚本的文件。但是,如果攻击者想要成功利用这个漏洞做一些事情,还需要两个条件:

1、需要在关键位置(比如:自动启动脚本)中创建恶意文件。
2、需要有权访问关键位置,应该由高权限的进程创建恶意文件。

实际上,这两个条件都可以实现。举例来说,可以为非特权用户创建Java UsageTracker配置(usagetracker.properties),具有更高特权的进程负责创建恶意日志文件(Usage Tracker日志)。

创建Java Usage Tracker日志文件

如果保存到全局配置路径中(例如Windows的%ProgramData%/Oracle/Java),在系统启动JVM时,就会读取Java Usage Tracker日志文件。接下来,我们再以默认Tomcat安装为例。在安装Tomcat,并使用全局usagetracker.properties之后,跟踪日志会在Tomcat重新启动后创建(如下图所示)。实际上,该文件是由Tomcat服务创建的,默认情况下会由System运行。

目前,Tomcat服务已经由System运行,因此就可以在任意位置创建恶意文件global_javatracker.bat。但是,配置文件usagetracker.properties还必须由非特权用户创建。

安装Tomcat后,创建的跟踪日志:

Windows Java Usage Tracker本地提权漏洞分析(CVE-2018-3211)

Tomcat创建的日志文件:

Windows Java Usage Tracker本地提权漏洞分析(CVE-2018-3211)

本地权限提升

Java Usage Tracker的全局配置文件,都创建在默认路径%ProgramData%/Oracle/Java/中。此路径中的内容,一部分是在Java安装期间创建的,也有一部分是在执行Java命令时创建的(例如java –c)。

默认情况下,%ProgramData%路径只允许系统的“Users”创建文件。当Oracle或Java路径被建立时,也会继承上级路径的默认权限。下图是%ProgramData%/Oracle/Java/权限的截图:

Windows Java Usage Tracker本地提权漏洞分析(CVE-2018-3211)

我们举例来进一步说明这个漏洞。具有低权限的用户,可以创建恶意配置文件usagetracker.properties。由于Tomcat服务以“System”的权限运行,因此它可以在系统的任何位置创建批处理文件。在批处理文件中,可以包括将脚本写入到启动项位置之类的例程。

总结

目前,攻击者可以通过多种方式,滥用Java Usage Tracker的功能来实现权限提升。我们的研究仅在Windows环境中进行了测试,但其他操作系统也可能受到该漏洞的影响。

攻击者为实现权限提升,可能会组合利用一些漏洞,这些漏洞包括:

1、任意文件类型创建:该漏洞可以通过oracle.usagetracker.logToFile路径实现。例如,可以创建一些类似于批处理文件的脚本。

2、参数注入:通过oracle.usagetracker.additionalProperties配置来实现。

3、本地权限提升:通过%ProgramData%/Oracle/Java中的弱权限来实现。

参考链接

https://blog.trendmicro.com/trendlabs-security-intelligence/cve-2018-3211-java-usage-tracker-local-elevation-of-privilege-on-windows/

*本文作者:eridanus96,转载请注明来自FreeBuf.COM

原文 

https://www.freebuf.com/vuls/187018.html

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Windows Java Usage Tracker本地提权漏洞分析(CVE-2018-3211)

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址