乾貨 | 如何繞過微軟Decvice Guard執行任意代碼
01 前言
在Windows 10 Enterprise和Server 2016引入的新功能Decvice Guard是一種白名單機制,可用來阻止未授權的代碼執行。
簡單的理解,只要是不包含微軟數字簽名的程序,均無法用來執行代碼。
然而,如果能夠找到帶有微軟簽名的程序,那麼就能繞過Decvice Guard對應用程序的攔截,實現代碼執行。
目前已知的方法有:
1、WinDbg/CDB
可用來執行shell code
作者:Matt Graeber@mattifestation
地址:Bypassing Application Whitelisting by using WinDbg/CDB as a Shellcode Runner
2、CSI.exe
可用來執行c#代碼
作者:Casey Smith@subTee
地址:https://twitter.com/subTee/status/796737674954608641
3、dnx.exe
可用來執行c#代碼
作者:Matt Nelson@enigma0x3
地址:Bypassing Application Whitelisting By Using dnx.exe
4、rcsi.exe
可用來執行c#代碼
作者:Matt Nelson@enigma0x3
地址:Bypassing Application Whitelisting By Using rcsi.exe
02 簡介
Matt Nelson@enigma0x3在最近分享了他繞過Decvice Guard的兩種方法,這是繼Matt Graeber@mattifestation和Casey Smith@subTee後的第三和第四種繞過方法,本文將重現這兩個過程,完成他留給讀者的兩個作業,優化dnx.exe的環境搭建步驟,分享學習心得。
03 dnx.exe
dnx.exe內置於.NET Execution environment,包含數字簽名,可用來執行c#代碼
首先搭建dnx.exe的使用環境
參考資料:
Step-by-step installation instructions for getting DNX on your Windows machine
資料顯示需要powershell v4.0和安裝Visual C++ 2013 redistributable package,實際測試」print helloworld」並不需要這些條件,同時配置步驟也可以簡化,以下為簡化的配置步驟:
測試系統:Win8 x86
1、下載並安裝Microsoft .NET Framework 4.5.2:
下載地址:
Download 適用於 Windows Vista SP2、Windows 7 SP1、Windows 8、Windows 8.1、Windows Server 2008 SP2、Windows Server 2008 R2 SP1、Windows Server 2012 和 Windows Server 2012 R2 的 Microsoft .NET Framework 4.5.2(Web 安裝程序) from Official Microsoft Download Center
2、安裝DNVM
cmd:
powershell -NoProfile -ExecutionPolicy unrestricted -Command "&{$Branch=』dev;iex ((new-object net.webclient).DownloadString(https://raw.githubusercontent.com/aspnet/Home/dev/dnvminstall.ps1))}"n
如圖
3、安裝DNX
打開新的cmd
cmd:
dnvm listn
輸入y,安裝dnx
如圖
cmd:
dnvm install latest -Unstable -Persistentn
cmd:
dnxn
將會看到dnx的操作說明
如圖
4、更新DNX和DNVM bits
cmd:
dnvm upgradendnvm update-selfn
如圖
5、配置Package
新建文件夾test
cmd:
cd c:testndnu restore -s Defaultn
如圖
註:
在C:WindowsSystem32直接輸入dnu restore -s Default會報錯,如圖
6、添加腳本文件
新建文件Program.cs,內容如下:
using System;npublic class Programn{n public static void Main()n {n Console.WriteLine("Hello World");n }n}n
註:
class名必須為Program,否則報錯
新建文件project.json,內容如下:
{n "dependencies":{n },n "commands":{n "test":"test"n },n "frameworks":{n "dnx451":{},n "dnxcore50":{n "dependencies":{n "System.Console":"4.0.0-beta-*"n }n }n }n}n
註:
project.json中」commands」內的」test」需要同文件夾名稱test對應
註:
中文系統的瀏覽器複製Step-by-step installation instructions for getting DNX on your Windows machine中的示例代碼為unicode格式,直接使用會報錯,如圖
7、測試腳本
cmd:
dnu restoren
如圖
cmd:
dnx testn
如圖
注:
如果僅測試上述代碼,只需完成步驟3即可
8、Win10 Device Guard測試
dnx.exe測試成功後,接下來需要找到dnx.exe在Win10上使用需要包含哪些支持文件,最直觀的方法可藉助於ProcessMonitor
使用ProcessMonitor獲取dnx.exe在運行時的操作,如圖
找到關鍵目錄:
經實際測試,在Win10上使用,只需要該目錄下的部分文件,大小為7.44MB
註:
這是Matt Nelson@enigma0x3留給讀者的作業
文件列表如下:
vcruntime140.dll(也可忽略,但會報錯,不影響代碼執行)
該目錄下的這些文件不需要:
如圖,由於dnx.exe包含微軟的簽名證書,所以在Device Guard UMCI(user mode code integrity)開啟的環境中仍具有執行許可權
繞過成功
04 rcsi.exe
rcsi.exe內置於Microsoft 「Roslyn」 CTP中,包含微軟數字簽名
Microsoft 「Roslyn」 CTP下載地址:
Microsoft 「Roslyn」 CTP
安裝前提:
1、實際測試
測試系統:Win8.1 x86
安裝Visual Studio 2012、VS2012 SDK、Microsoft 「Roslyn」 CTP
2、執行代碼
rcsi.exe的路徑為:
新建文件test.csx,內容如下:
using System;nConsole.WriteLine("Hello World");nConsole.ReadLine();n
cmd:
"C:Program FilesMicrosoft Roslyn CTPBinariesrcsi.exe" test.csxn
如圖,成功執行C#代碼
rcsi.exe同csi.exe類似,可以用來執行c#代碼,不同點在於csi.exe支持交互,而rcsi.exe不能
如圖
3、Win10 Device Guard測試
rcsi.exe在Win10上運行同樣需要支持文件
同樣使用ProcessMonitor獲取rcsi.exe在運行時的操作,如圖
找到rcsi.exe需要的支持文件如下:
註:
這也是Matt Nelson@enigma0x3留給讀者的作業
在Win10下測試成功,如圖
05 防禦
參照Matt Graeber的方法,更新Device Guard Bypass MitigationRules,可分別攔截利用WinDbg/CDB、csi.exe、dnx.exe和rcsi.exe的代碼執行
參考地址如下:
Using Device Guard to Mitigate Against Device Guard Bypasses
06 小結
本文對dnx.exe和rcsi.exe的利用方法做了介紹,截至目前共有四種繞過Device Guard的方法,相信未來會有更多的方法被發現,與此同時,防禦手段也需要隨之升級。
註:本文為3gstudent原創稿件,授權嘶吼獨家發布,未經許可禁止轉載
推薦閱讀:
※如何利用sdclt.exe繞過UAC?
※趨勢科技技術分析:詳解無文件勒索病毒Sorebrect
※如何利用 DLL hijack 輕鬆繞過AMSI?
TAG:技术分析 |