ApacheTomca远程执行代码(CVE-2019-0232)漏洞浅析和复现 – 作者:爱上卿Ooo

ApacheTomca远程执行代码(CVE-2019-0232)漏洞浅析和复现

一、 漏洞背景

Apache Tomcat,俗称Tomcat Server,是一个开源的JavaServlet容器,由社区在Apache Software Foundation(ASF)的支持下开发。它实现了多个Java EE规范,包括Java Servlet,JavaServer Pages(JSP),Java表达式语言(EL)和WebSocket,并提供了一个“纯Java”HTTP Web服务器环境,Java代码可以在该环境中运行。

2019年4月15日,Nightwatch网络安全发布的信息对CVE-2019-0232,包括Apache Tomcat上的通用网关接口(CGI)Servlet的一个远程执行代码(RCE)漏洞。这种高严重性漏洞可能允许攻击者通过滥用由Tomcat CGIServlet输入验证错误引起的操作系统命令注入来执行任意命令。

二、  影响版本

影响版本如下:

tomcat 7.0.04之前

tomcat 8.5.40之前

tomcat 9.0.19之前  

三、  漏洞分析

CGI(CommonGateway Interface) 是WWW技术中最重要的技术之一,有着不可替代的重要地位。CGI是外部应用程序(CGI程序)与WEB服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的过程。CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。CGI脚本用于执行Tomcat Java虚拟机(JVM)外部的程序。默认情况下禁用的CGI Servlet用于生成从查询字符串生成的命令行参数。由于Java运行时环境(JRE)将命令行参数传递给Windows的错误,在启用CGI Servlet参数enableCmdLineArguments的Windows计算机上运行的Tomcat服务器很容易受到远程代码执行的影响。

ApacheTomcat文件web.xml用于为加载到Tomcat实例中的所有Web应用程序定义默认值。CGI Servlet是默认提供的servlet之一。该servlet支持执行符合CGI规范的外部应用程序。通常,CGI Servlet映射到URL模式“/cgi-bin / *”,这意味着任何执行的CGI应用程序必须存在于Web应用程序中。

image.png

通过调用CreateProcess()函数启动Windows操作系统中的新进程,该函数将以下命令行作为字符串(对CreateProcess的lpComandLine参数):int CreateProcess(…,lpComandLine,…)

Windows中的参数不是作为字符串数组单独传递的,而是作为单个命令行字符串传递的。这要求程序通过使用GetCommandLine() API 提取命令行字符串然后使用CommandLineArgvW()辅助函数解析参数字符串来解析命令行本身。Windows的命令行字符串流程图如下:

image.png

漏洞是由于命令行参数从JRE到Windows的不正确传递而产生的,对于Java应用程序,在CreateProcess()函数启动之前调用ProcessBuilder()。然后将参数传递给ProcessImpl()的静态方法start ,这是一个依赖于平台的类。在ProcessImpl()的Windows实现中,start方法调用ProcessImpl()的私有构造函数,该构造函数为CreateProcess调用创建命令行。Java应用程序的命令行字符串流程图如下:image.png

ProcessImpl()构建Cmdline并将其传递给CreateProcess() Windows函数,之后CreateProcess()  在cmd.exe shell环境中执行.bat.cmd文件。

如果要运行的文件包含.bat或.cmd扩展名,则要运行的映像将变为cmd.exe,即Windows命令提示符。然后CreateProcess()在阶段1重新启动,批处理文件的名称作为cmd.exe的第一个参数传递。这导致’hello.bat …’成为’C:\ Windows \ system32 \cmd.exe / c“hello.bat …” ‘。由于CommandLineToArgvW的引用规则与cmd的引用规则不同,这意味着需要应用一组额外的引用规则以避免cmd.exe解释的命令行中的命令注入。

由于Java(ProcessImpl())确实没有额外的报价为这种隐含的cmd.exe上传递的参数调用推广,通过加工参数的cmd.exe现在被用来执行,呈现固有的问题,如果参数不传递给cmd.exe的正确。

对于cmd.exe,我们首先理解cmd本质上是一个文本预处理器:给定一个命令行,它进行一系列文本转换,然后将转换后的命令行交给CreateProcess()。某些转换用其值替换环境变量名称。转换,例如由&,||,&&运算符触发的转换,将命令行拆分为几个部分。所有cmd的转换都由以下元字符之一触发:(,),%,!,^,“,<,>,&和|。元字符“特别有趣:当cmd正在转换命令行并看到”时,它会将“复制”到新的命令行,然后开始将字符从旧命令行复制到新命令行,而不会看到是否有任何这些字符是元字符。这一直持续到cmd到达命令行的末尾,进入变量替换,或者看到另一个“。

如果我们依赖cmd的“-behavior来保护参数,使用引号会产生意外行为。通过将不受信任的数据作为命令行参数传递,由此约定不匹配引起的错误成为安全问题。

例如,以下内容:

hello.bat“dir\”&whoami“

0:[hello.bat]

1:[&dir]

这里,cmd将&metacharacter解释为命令分隔符,因为从它的角度来看,&字符位于引用区域之外。在这种情况下,’whoami’可以被任意数量的有害命令所取代。当使用hello.bat运行上面显示的命令时实现命令执行。

四、  漏洞复现

首先下载有漏洞的tomcat版本,加压到响应文件夹,然后配置环境变量。image.png

image.png

image.png

然后修改conten.xml

image.png

修改web.xml,添加一些参数并在web.xml文件中启用CGIServlet。

image.png

两个文件修改后,启动服务器,访问http://localhost:8080/image.png

image.png

成功访问到tomcat后,创建hello.bat脚本放入cgi-bin目录下。image.png

 hello.bat内容image.png

然后访问http://localhost:8080/cgi-bin/hello.bat?dir,显示如下命令执行成功。image.png

image.png

五、  修复建议

下载Apache Tomcat官方补丁尽快升级进行防护。同时,用户可以将CGI Servlet初始化参数enableCmdLineArguments设置为false来进行防护。

关注我们

Tide安全团队正式成立于2019年1月,是以互联网攻防技术研究为目标的安全团队,目前聚集了十多位专业的安全攻防技术研究人员,专注于网络攻防、Web安全、移动终端、安全开发、IoT/物联网/工控安全等方向。

想了解更多Tide安全团队,请关注团队官网: http://www.TideSec.net 或关注公众号:

ewm.png

来源:freebuf.com 2019-05-21 10:44:35 by: 爱上卿Ooo

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论