zoukankan      html  css  js  c++  java
  • GhostCat漏洞的一些见解

    关于我之前研究GhostCat漏洞的复现,后做出的一些想法,想得到验证,故有此一篇文章。

    从GhostCat漏洞的出发点都不难看出是从tomcat的web.xml中的servlet配置

    但除了网上流传的exp之外,我发现对cgi的利用缺没有人研究。

     如正常方式配置CGIServlet服务

     在Context.xml文件中添加privileged="true"

    开启debug之后

     程序会执行this.prepareRequest()解析请求

    并传入CGIServlet的doget方法

     在CGIServlet.CGIEnvironment方法中设置了如下变量:

    this.context = this.getServletContext();
    this.webAppRootDir = context.getRealPath("/");
    this.tmpDir = (File)context.getAttribute("javax.servlet.context.tempdir");

    往后调用了

     进入后获取web路径

     cginame存放着要运行的cgi程序

     如果cginame中存放的不是文件,则findCGI会返回null

     这里开始我换了个路径

     

     继续查看代码

     这里的contextPath、servletPath和cginame都可控

     这里以字符串数组进行返回

     返回出来后执行

     将所有env环境保存,退回到doget方法

     cgi.run方法中存在runtime().exec()

     执行的程序是python

     输入的程序为路径

    最终导致任意路径程序运行

     如果用普通的http协议是无法复现成功的。

    漏洞利用条件:

    1.Tomcat服务器需要开启CGIServlet

    2.Tomcat AJP协议可以操控相关属性

    3.利用的CGI的路径必须存在,且为文件类型。

    4.有可以操控的文件。(上传文件、日志文件)

     

     CGI文件如下:

     exec执行参数:

     如果想要执行系统命令,所执行的文件必须跟上绝对路径

     运行poc

     同时在python的lib目录中存在一个formatter.py的gadget,可以通过利用formatter.py来读取任意文件的内容。由于formatter.py是需要参数,这里可以通过set该qurey_string属性

     Windows下传入的query_string参数不能带有 “” 字符所以这里路径得用 “/”

     要能使参数传入进去,首先必须得enableCmdLineArguments参数为true

     运行程序,并传入参数

    安全防御:

    在tomcat8.5.51以后的版本不存在GhostCat漏洞,这里在AjpProcess类中进行对比

     新版Tomcat在static代码类中添加了一个javaxAttributes变量

    该HashSet中存在的属性解为白名单数据

     在更新的版本中AJP协议的功能以及默认关闭了

  • 相关阅读:
    LeetCode 面试题 02.02. 返回倒数第 k 个节点
    LeetCode 1290. 二进制链表转整数
    LeetCode 面试题52. 两个链表的第一个公共节点
    LeetCode 2. 两数相加
    Jupyter Notebook 常用快捷键 (转)
    LeetCode 414. 第三大的数
    LeetCode 404. 左叶子之和
    三年了
    LeetCode 543. 二叉树的直径
    求结点在二叉排序树中层次的算法
  • 原文地址:https://www.cnblogs.com/wh4am1/p/12359267.html
Copyright © 2011-2022 走看看