tomcat远程代码执行漏洞(CVE-2019-0232)
漏洞原理
漏洞相关的代码在 tomcat\java\org\apache\catalina\servlets\CGIServlet.java 中,CGIServlet提供了一个cgi的调用接口,在启用 enableCmdLineArguments 参数时,会根据RFC 3875来从Url参数中生成命令行参数,并把参数传递至Java的 Runtime 执行。这个漏洞是因为 Runtime.getRuntime().exec 在Windows中和Linux中底层实现不同导致的
Java的 Runtime.getRuntime().exec
在CGI调用这种情况下很难有命令注入。而Windows中创建进程使用的是 CreateProcess
,会将参数合并成字符串,作为 lpComandLine
传入 CreateProcess
。程序启动后调用 GetCommandLine
获取参数,并调用 CommandLineToArgvW
传至 argv。在Windows中,当 CreateProcess
中的参数为 bat 文件或是 cmd 文件时,会调用 cmd.exe
, 故最后会变成 cmd.exe /c "arg.bat & dir"
,而Java的调用过程并没有做任何的转义,所以在Windows下会存在漏洞
漏洞复现
启动tomcat
访问一下已经启动成功
Tomcat的 CGI_Servlet组件默认是关闭的,在conf/web.xml
中找到注释的 CGIServlet部分,去掉注释,并配置enableCmdLineArguments和executable
这里注意一下,去掉注释并添加以下代码
enableCmdLineArguments启用后才会将Url中的参数传递到命令行executable指定了执行的二进制文件,默认是perl,需要置为空才会执行文件本身。 <init-param> <param-name>enableCmdLineArguments</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>executable</param-name> <param-value></param-value> </init-param>
然后在conf/web.xml中启用cgi的 servlet-mapping
修改conf/context.xml的添加 privileged="true"属性,否则会没有权限
添加true
<Context privileged="true">
在C:\Tomcat\webapps\ROOT\WEB-INF
下创建cgi-bin
目录
在该目录下创建一个hello.bat
然后重启tomcat环境
访问http://localhost:8080/cgi-bin/hello.bat?&C%3A%5CWindows%5CSystem32%5Ccalc.exe
即可弹出计算器,这里构造系统命令即可
转载于:https://paper.seebug.org/1677/#cve-2019-0232