您好,登录后才能下订单哦!
这篇文章给大家介绍如何进行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应用程序中。
通过调用CreateProcess()函数启动Windows操作系统中的新进程,该函数将以下命令行作为字符串(对CreateProcess的lpComandLine参数):int CreateProcess(...,lpComandLine,...)
Windows中的参数不是作为字符串数组单独传递的,而是作为单个命令行字符串传递的。这要求程序通过使用GetCommandLine() API 提取命令行字符串然后使用CommandLineArgvW()辅助函数解析参数字符串来解析命令行本身。Windows的命令行字符串流程图如下:
漏洞是由于命令行参数从JRE到Windows的不正确传递而产生的,对于Java应用程序,在CreateProcess()函数启动之前调用ProcessBuilder()。然后将参数传递给ProcessImpl()的静态方法start ,这是一个依赖于平台的类。在ProcessImpl()的Windows实现中,start方法调用ProcessImpl()的私有构造函数,该构造函数为CreateProcess调用创建命令行。Java应用程序的命令行字符串流程图如下:
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版本,加压到响应文件夹,然后配置环境变量。
然后修改conten.xml
修改web.xml,添加一些参数并在web.xml文件中启用CGIServlet。
两个文件修改后,启动服务器,访问http://localhost:8080/
成功访问到tomcat后,创建hello.bat脚本放入cgi-bin目录下。
hello.bat内容
然后访问http://localhost:8080/cgi-bin/hello.bat?dir,显示如下命令执行成功。
五、 修复建议
下载Apache Tomcat官方补丁尽快升级进行防护。同时,用户可以将CGI Servlet初始化参数enableCmdLineArguments设置为false来进行防护。
关于如何进行ApacheTomca远程执行代码CVE-2019-0232漏洞浅析和复现就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。