一、簡介
Mandiant在處置應急相應變亂時,發明進擊者有時會自動應用被沖破收集中的操作體系。進擊者常常經由進程RDP方法來應用交互式節制臺(console)法式,好比敕令行、PowerShell、和自定義的C2(敕令與節制)節制臺對象等。以此為契機,Mandiant的ICE(Innovation and Custom Engineering)團隊研討了若何捕獲端點上的黑客運動軌跡。
捕獲這種數據的難度取決于目的Windows體系的版本,好比,在及時體系上捕獲相干數據是異常艱苦的一件工作。這一義務的艱苦水平與曩昔十幾年中Windows對虛構節制臺的詳細完成方法密切相干。
在本文中,咱們評論辯論了曩昔幾年中Windows對節制臺架構的詳細完成,重點闡發了以后Windows版本中節制臺的詳細完成機制。
二、節制臺概述
Windows PE加載器會依據PE選項頭中的“Subsystem”字段來斷定某個文件能否為節制臺應用法式。假如這個字段的值為IMAGESUBSYSTEMWINDOWS_CUI,加載器會為該進程分派一個節制臺辦事器(console server)。在分歧版本的Windows體系中,節制臺辦事器的詳細完成也有所分歧,從Windows XP起,節制臺的完成方法經過了三次較大的篡改。不外不管詳細的完成細節若何,當運轉某個客戶端(如cmd.exe、powershell.exe等)時,默許情況下,體系平日會應用AllocConsole這個Win32 API來樹立與節制臺辦事器的銜接。用戶鍵入敕令時,平日需要與辦事器進程停止交互,這些敕令隨后會經由進程進程間通訊(Interprocess communication,IPC)機制傳遞給客戶端進程。一個節制臺辦事器可以或許同時托管一個或多個客戶端。
三、Windows節制臺的演進汗青
從Windows XP起到Windows Vista體系,Windows應用客戶端/辦事器運轉時子體系(Client/Server Runtime Subsystem process,CSRSS)來賣力處置用戶的輸入,并將輸入數據發送給客戶端進程。客戶端與CSRSS之間應用當地進程挪用(Local Procedure Call,LPC)端口停止通訊,以發送收到的輸入數據。在Windows XP和Vista體系中應用的客戶端-辦事器節制臺架構如圖1所示。


圖1. Windows XP/Vista中的節制臺架構
在這個模子中,因為客戶端以以后用戶身份運轉,而辦事器以當地體系賬戶(Local System)身份運轉,是以輕易遭到權限晉升破綻影響。進擊者可以或許應用CSRSS這個脆缺點,在低權限用戶形式下觸發CSRSS的破綻代碼門路,獲得SYSTEM級其余拜訪權限。
跟著Windows 7和Windows Server 2008 R2的宣布,這個架構成績也隨之辦理。如今CSRSS不是體系中獨一的節制臺辦事器,體系新引入了一個節制臺宿主進程(conhost.exe),以托管節制臺的輸入線程。這個進程如今與客戶端運轉在同一個上下文情況中,是以可以或許打消這種進擊場景。更新后的Windows 7節制臺架構如圖2所示。


圖2. Windows 7/Server 2008 R2中的節制臺架構
當Windows 7中分派一個節制臺時,CSRSS就會運轉一個新的conhost.exe實例進程。操作體系會應用\RPC Control\ConsoleLPC--這種稱號來創立一個高檔當地進程挪用(Advanced Local Procedure Call,ALPC)端口。這個端口與映照到客戶端和辦事器進程中的一個同享對象共同應用,是以可以或許輕松同享敕令行數據。其余,體系也會應用\RPC Control\ConsoleEvent--這種稱號創立一個變亂對象,以便在新的數據出現時,客戶端與辦事器之間可以或許應用該對象關照對方。一個conhost.exe進程可以或許為多個客戶端應用供給辦事,如圖3中Windbg的輸入信息所示。


圖3. 應用Windbg闡發Windows 7體系中的ALPC端口,該端口對應一個conhost進程與多個節制臺應用
從Windows 8開端,Windows引入了新的節制臺完成機制。新的架構與以前架構最大的分歧在于,新架構中有個專門的內核驅動來賣力處置客戶端與辦事器進程之間的節制臺I/O數據。這個驅動便是ConDrv.sys,賣力體系上的一切節制臺通訊。驅動經由進程名為\Device\ConDrv的驅動對象為用戶形式下的應用法式供給接口。用戶形式下的應用法式可以或許應用一些定名空間參數(如Connect、Server、Input、Output、Reference、CurrentIn和CurrentOut)來關上這個驅動對象,應用法式可依據現實需要決議詳細應用哪些參數。依據驅動所需的詳細功效,客戶端應用法式平日會關上節制臺驅動的多個句柄,如圖4所示。


圖4. 敕令行應用法式關上多個ConDrv句柄
當某個敕令行進程分派一個節制臺時,kernelbase.dll就會關上\Device\ConDrv的一個句柄,并哀求體系創立一個新的conhost.exe進程。ConDrv會在內核形式下運轉這個進程,并分派內存描寫符列表(memory descriptor list ,MDL)鏈。MDL鏈可以或許用來映照Conhost進程及其客戶端的內存頁面,以便該進程與客戶端之間同享數據。與以前版本所應用的LPC/ALPC端口分歧,體系如今平日會應用Fast I/O將新聞傳遞給節制臺驅動。在Fast I/O的贊助下,應用法式可以或許與驅動停止通訊,而且無需為每一個哀求創立I/O哀求數據包(I/O request packet,IRP)。IRP是一種操作體系架構,用來將I/O數據投遞給設備驅動。這些疾速I/O哀求由ConDrv驅動賣力,可以或許用來讀取或寫入節制臺。在Windows 10中,conhost.exe重要充任容器進程腳色。ConhostV2.dll或許ConhostV1.dll賣力重要的輸入線程和一切的辦事器功效。默許情況下,體系會加載ConhostV2.dll并向Windows 10用戶供給新的節制臺功效(好比節制臺窗口全屏化)。ConhostV1.dll完成了“傳統形式”的節制臺功效,啟用這種形式后,節制臺的表示與Windows 7和以前版本的體系相似。不論詳細應用的是哪一個版本,體系都應用ConDrv.sys來傳輸節制臺客戶端與辦事器之間的新聞。全體布局如圖5所示。


圖5. Windows 10中基于節制臺驅動的架構
讀者可以或許瀏覽第二篇文章懂得后續內容。
|