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

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应用程序中。

a21302c3479e89ed6b87da514556f348.png

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

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

c9fa6e1de91da5671b2e9c23241689e8.png

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

baf86b8187038bf840781da00164898a.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版本,加压到响应文件夹,然后配置环境变量。

eeea2f951968dbab8efb8dfc3b8ff5e9.png

0b332630c1bfd0f38db641d5db607706.png

acfd0eeee2de307728cc7ed4e7a71924.png

然后修改conten.xml

7cd13f7946d503ca67150721a6c6ec54.png

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

ee36d35406dcb3f9ec5bc90485069a5e.png

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

f23de75a7a9260708c2ee8ff2bee6166.png

f252388ea9cfd72c934158dd288845c8.png

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

ef8e11f75f18db9d9e8f9c080cb6308c.png

hello.bat内容

e10d0d672e8d0c2123c7e3e6253ddacf.png

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

833e36e3b8bf8f0df56a1ebbf520d0ef.png

ebd0de0ee901d93306820eef2b417731.png

五、修复建议

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

关注我们

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值