一、简介
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中基于节制台驱动的架构
读者可以或许浏览第二篇文章懂得后续内容。
|