漏洞描述
2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,漏洞CVE编号:CVE-2017-12615和CVE-2017-12616,其中 远程代码执行漏洞(CVE-2017-12615) 当 Tomcat 运行在 Windows 主机上,且启用了 HTTP PUT 请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求向服务器上传包含任意代码的 JSP 文件。之后,JSP 文件中的代码将能被服务器执行。
影响版本
Apache Tomcat 7.0.0 - 7.0.79(7.0.81修复不完全)
环境搭建
操作系统:Windows10
操作环境: apache-tomcat-7.0.79、jdk-8u301-windows-x64
漏洞版本: 7.0.79
搭建过程:
(1)安装JDK
1)双击jdk-8u301-windows-x64进行JDK安装
2)默认下一步
3)默认下一步
4)安装完成
5)右击“此电脑”选择“属性”
6)选择“高级系统设置”
7)选择“环境变量”
8)设置jdk环境变量,新建系统变量,取名为“JAVA_HOME”,变量值为JDK安装路径,这里是“C:\Program Files\Java\jdk1.8.0_301”,点击“确定”
9)选择“PATH”,添加“%JAVA_HOME%\bin”,点击“确定”,至此JDK安装完成
(2)下载apache-tomcat-7.0.79(http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.79/bin/apache-tomcat-7.0.79-windows-x64.zip),解压放在任意目录下,这里是放在E盘中
(3)打开Tomcat安装目录下的conf文件夹,编辑并保存web.xml文件。配置文件中添加readonly设置为false时,目的是启用PUT和DETELE方法
(4)打开Tomcat安装目录下的bin文件夹,双击“startup.bat”,开启服务
(5)访问环境:http://192.168.17.140:8080,若出现下图界面,则说明环境搭建成功
漏洞复现
(1)访问http://192.168.17.140:8080/,使用burpsuit工具进行抓包,并将请求包发送至Repeater
(2)将请求包GET方式改为PUT方式,上传ceshi.jsp,内容为“Hello Word”,点击发送,发现服务器返回“201”
(3)访问刚上传的ceshi.jsp文件,发现可访问,从而确定存在CVE-2017-12615漏洞
(4)接下来上传木马backdoor.jsp,如图所示上传成功
(5)使用冰蝎连接shell,密码为“rebeyond”
(6)成功连接shell,并在文件管理中发现刚才上传的两个文件
(7)在冰蝎-命令执行模块中,执行“whoami”,发现得到的是管理员administrator用户
(8)在文件管理模块上传“1.bat”(目的开启3389),在命令执行模块执行该文件
1.bat内容:
echo DO ALL IN CMD!
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0 /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp" /v PortNumber /t REG_DWORD /d 3389 /f
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 3389 /f
(9)通过执行“netstat -ano”发现3389端口已开启
(10)通过“net user administrator hacker”命令,修改管理员密码
(11)在攻击者环境中开启远程桌面连接192.168.17.140,最终攻击攻击成功
修复建议
临时修复建议:
用户可以禁用PUT方法来防护此漏洞,操作方式如下:
在Tomcat的web.xml 文件中配置org.apache.catalina.servlets.DefaultServlet的初始化参数
<init-param>
<param-name>readonly</param-name>
<param-value>true</param-value>
</init-param>
确保readonly参数为true(默认值),即不允许DELETE和PUT操作。