概述

安全等级

《可信计算机系统评估标准》将操作系统、网络组件和可信应用程序所提供的安全保护等级分为4大类,7小类,从高到低为: A1、B3、B2、B1、C2、C1、D

image-20250605204827049

目前尚没有任何操作系统满足A1等级;仅有很少一部分操作系统满足B等级;C2等级被认为针对通用操作系统来说已经足够安全的了。(目前的Windows、MAC、IOS等系统均是C2等级

  • D级,最低保护(Minimal Protection)

    没有通过其他安全等级测试项目的系统即属于该级,如DOS、Windows 9x系统

  • C级,自主访问控制(Discretionary Protection)

    系统客体(被访问的,如文件、目录)可由系统主体(能够发起行为的,如用户、应用程序)自主定义访问权。例如:管理员可以决定系统中任意文件的权限。

    客体的权限是可以自主决定的。

  • B级,强制访问控制(Mandatory Protection)

    由系统强制对客体进行安全保护,每个系统客体(如文件、目录等资源)及主体(如系统管理员、用户、应用程序)都有自己的安全标签(Security Label),系统依据用户的安全等级赋予其对各个对象的访问权限。

    由主体创建的客体的权限并不由主体说了算,而是以管理员定制的安全策略说了算。

  • A级,可验证访问控制(Verified Protection)

    系统拥有正式的分析及数学式方法可完全证明该系统的安全策略及安全规格的完整性与一致性。

Windows系统版本

image-20250606162111211

Windows 9x内核没有任何安全性;Windows NT内核才开始具有安全性稳定性健壮性。一般提及的Windows操作系统即Windows NT内核的操作系统。

Windows从NT 3.5开始满足C2级别的安全性,具体表现为(3个A + 对象重用保护):

  • 安全登录设施(Secure logon facility)

    所有用户都必须以唯一的登录标识和密码来鉴别自身,从而跟踪用户的活动,而且只有授权的用户才能访问相应的系统资源。

  • 自主访问控制( Discretionary access control, DAC)

    资源的所有者能够决定谁可以访问该资源, 以及他们可以对它做什么。

  • 安全审计(Security auditing)

    能够检测和记录与安全性相关的事件,或者任何想要创建、访问或删除资源的意图。

  • 对象重用保护( Object reuse protection)

    防止用户看到其他用户已经删除的数据,或者访问到用户原先已经使用过后来又释放了的内存。

同时,Windows NT系统也满足B级别安全性的以下两个要求(但其不满足B基本安全性,只是满足两个条件而已):

  • 可信路径功能( Trusted path functionality)

    防止木马程序在用户登录的时候能够截取到用户的名称和口令。在Windows中,可信路径功能是以**Ctrl + Alt + Del安全维护序列**的形式来做到的,非特权应用程序无法截获到此序列。

    当按下Ctrl + Alt + Del 这三个键,信号是直接送给操作系统最核心、最可信赖的部分(内核)的,绕过所有其他普通程序(包括可能的木马)。按下后,系统会切换到一个受保护的登录桌面,只有真正负责登录的程序(比如 winlogon.exe)能在这个桌面上运行,其他任何程序(包括木马)都无法看到或干扰这个桌面上的操作。普通的程序(非特权应用)无法拦截或模仿这个三键组合。它们不知道你按了,更无法在你按的时候做坏事。

  • 可信设施管理(Trusted facility management)

    要求针对管理功能有单独的账户角色作为支撑。例如,针对管理工作(管理员)、负责计算机备份的用户和标准用户分别提供单独的账户。

    Windows NT 引入了不同的管理角色账户,把管理任务分开:

    • 管理员(Administrator):这是“大总管”,拥有最高权限,能做几乎任何事情(安装软件、修改系统核心设置、管理用户等)。但日常操作不应该用这个账户,风险太大。
    • 备份操作员(Backup Operator):这个账户的权限只够做备份和恢复文件。它不能安装软件,不能修改系统设置,不能随意查看普通用户的文件(除非是为了备份)。这样,负责备份的人只需要用这个专用账户,即使这个账户泄露了,危害也有限。
    • 标准用户(User):这是日常办公用的账户,权限最小。只能运行程序、访问自己的文件和一些公共资源。不能乱装软件、不能改系统设置。

Windows系统安全发展

image-20250606165354829

Win7在Vista上新增了针对UAC的白名单机制,在某种程度上解决了UAC的误报问题,但也催生了新的安全问题。

  • SDL(Microsoft安全开发生命周期):SDL自2004年起就成为Microsoft全公司的计划和强制施行政策,其核心理念就是在需求分析、设计、编码、 测试和维护的每一阶段都增加相应的安全活动与规范,以减少软件中漏洞的数量并将安全缺陷降低到最小程度。

    SDL的核心原则: 攻击面最小化、基本隐私、权限最小化、默认安全、纵深防御、威胁建模。

  • MAPP项目:Microsoft于2008年推出MAPP项目,即提前一天告知各安全公司即将发布的补丁,旨在为第三方安全厂商提供预警,以便他们能够提前研究和测试这些补丁。

Windows基本情况

防篡改功能

  • Windows文件保护(WFP) — Windows 5.x;Windows资源保护(WRP) — Windows 6.x及以后

    防止Windows重要的系统文件被恶意篡改、替换或删除。

    隐藏存储目录:

    • WFP: %systemroot%/system32/dllcache
    • WRP: %systemroot%/winsxs/backup
  • 内核模式写保护:防止Windows内核被非法修改。

  • 驱动程序签名:防止非法(无信任签名)的驱动程序加载到系统中。详细可见[Code Signing - 代码签名检查机制](#####Code Signing - 代码签名检查机制)

内存安全防护机制

DEP(Data Executive Prevention, 数据执行保护)

Windows XP SP2开始引入,缺省仅为基本的Windows程序和服务启用DEP。基本原理是将数据所在的内存页标记为不可执行代码与数据分离),当程序产生溢出,恶意代码试图在数据段执行指令时, CPU会产生异常而不去执行指令。

这个机制需要CPU的支持。 AMD公司推出了EVP(EnhancedVirus Protection) , Intel推出了EDB(Execute Disable Bit) , 这些技术在原理上均是在内存的页表中加入一个特殊的标识位(NX/XD)来标识是否允许在该页上执行指令。

DEP的四种可选参数:

  • OptIn:对于多数用户版本的操作系统来说,如Windows XP/7/10,默认仅为一些基本的Windows程序和服务启用DEP保护。 该模式可被应用程序动态关闭
  • OptOut:多用于服务器版本的操作系统,如Windows Server2003/2008/2012等,为所有在所选列表外的程序和服务启用DEP,这种模式下, DEP仍可被应用程序关闭
  • AlwaysOn:对所有的进程启用DEP保护,不存在排除列表。该模式不可以被关闭,仅在64位操作系统上才能实现,最大限度的保证了所有程序都能够抵御溢出攻击。
  • AlwaysOff:对所有的进程都禁用了DEP保护,DEP也不能被应用程序动态开启,这该模式一般只有在特殊场合才会使用。
ASLR( Address Space Layout Randomization,内存地址空间布局随机化)

在加载程序到内存空间时随机化各个模块的起始加载地址,防止攻击者定位攻击指令代码的位置。ASLR需要操作系统及应用程序的双重支持才能发挥作用,支持ASLR的程序在PE头中会设置IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE标识表明其支持ASLR。

ASLR主要影响的部分:

  • 模块随机化:系统将PE文件映射到内存时,对其加载基地址进行随机化处理, 基地址在系统启动时确定,系统重启后会变化。
  • 堆栈随机化:每次程序加载后,其内存空间中堆、栈的基址都会发生变化。于是内存中的变量所在的地址也会发生变化。
  • PEB/TEB随机化
EPM ( Enhanced Protection Mode,增强保护模式)

也叫做“沙盒模式”(Sandbox Mode),本质上是隔离进程和降低权限。Windows 8的IE 10开始引入,从Windows 8.1开始默认启用。

image-20250610164943441

Windows Vista/7引入的重要安全性机制

PatchGuard - 内核补丁保护

这个其实就是防篡改功能的加强版,在64位版本的Windows操作系统中提供的新功能,用于保护操作系统的核心结构,防止他们被其他程序修改。主要保护了下面几种数据结构:

  • 系统服务描述符表SSDT(System Service Descriptor Table),即系统服务派遣表;
  • 全局描述符表GDT(Global Descriptor Table)和中断描述符表IDT( Interrupt Descriptor Table);
  • 系统映像(System Images),如ntoskrnl.exe、 ndis.sys、 hal.dll等;
  • 其他

PatchGuard处在系统任务的一个较高层面上,通过每隔一定时间进行一些固定的检查来确定这些系统关键内容是否更改。这些检查主要通过将核心内容与缓存中保存的已知正确的备份进行对比,检测时间间隔大约为5-10分钟的某一随机选择时间。由于缺乏本地硬件水平的支持,只能通过轮询的形式, 而不是采用事件驱动或硬件驱动的形式。

Code Signing - 代码签名检查机制
  • 加载到系统内核中运行的驱动程序必须有数字签名以保证其代码的完整性,否则系统内核就不加载该驱动程序;
  • 代码完整性检测被加载到内核中的驱动程序或系统文件是否已经被签名,或正在运行系统管理员账户权限的系统文件是否已被恶意软件篡改;
  • 64位的Windows系统默认启用代码签名检查机制。
image-20250610162135147

Windows 8引入的重要安全性机制

  • ASLR随机熵提高:在Windows 8 中,特别是在64位下可以获得更高的随机熵。

  • 空值引用保护( NULL dereference protection)

    空值引用(NULL dereference)是由于声明变量时将变量初始化为Null,之后引用该对象却未进行空值判断造成的。如果攻击者能够故意触发空指针间接引用,攻击者就有可能利用引发的异常绕过安全逻辑,或致使应用程序泄漏调试信息,最终进行本地漏洞利用。Windows 8之前,内核允许用户进程映射NULL页,而Windows8则禁止对前64k的空间进行映射。

  • 内核缓冲区完整性检查

  • 禁止零页内存分配

    Windows操作系统中,零页内存供16位虚拟机NTVDM使用,以确保16位代码正常运行。之前系统中存在一些内核漏洞,通过ZwAllocateVirtualMemory等系统调用可以在进程中分配出零页内存,触发未初始化对象指针/数据指针引用漏洞或辅助漏洞进行攻击。Window 8中,禁止进程申请低地址内存(0x0~0x10000); 同时,默认禁用16位虚拟机,需要管理员权限才能开启。 Windows 8在所有可能的内存分配位置检查零页分配。

  • 禁止Win32k系统调用:Win32k.sys是Windows内核漏洞高发对象,对它的调用不受进程权限的限制。

  • 不可执行的非分页池

  • UEFI启动技术:Windows 8 拥有新的保护机制来对抗Rootkit和Bootkit。所有版本的Windows 8都将包括统一可扩展固件接口(UEFI)安全开机功能,该功能取代了标准BIOS来作为电脑的固件接口。– UEFI安全启动是实现跨平台和固件安全的基础,与体系结构无关。在执行固件映像之前,安全启动基于公钥基础结构的流程来验证固件映像,帮助降低遭受启动加载程序攻击的风险。

  • Intel Secure Key 技术:Intel在2012年4月正式发布的第三代Core处理器中加入了IntelSecure Key技术(代号“公牛山”)。该技术提供了对硬件实现的底层数字化随机数生成器(DRNG)的支持;提供了基于硬件的高性能、高质量的熵和随机数生成器;引入了新的指令RDRAND。– Windows 8系统内核开始使用该指令产生随机数, 如重要的Security Cookie、 ASLR的生成过程。

Windows 10引入的重要安全性机制

  • 基于硬件虚拟化的安全隔离

    Windows10引入了CredentialGuard和DeviceGuard安全功能,运用硬件虚拟化技术,实现安全隔离。这两项功能主要存在于Windows10企业版中。

    CredentialGuard使用硬件虚拟化功能(VSM)将证书/令牌的存储和管理和真实操作系统隔离,使得恶意程序即使拥有系统内核权限,也无法获取用户的证书,避免攻击者使用例如Mimikatz之类的工具来实现企业网络的进一步渗透。

    DeviceGuard则可以允许企业管理和锁定设备,禁止设备上安装未受信的软件。

  • 多因子安全认证的支持:支持移动设备、生物识别、 PIN码等多种方式的多因子认证保护,取代传统的Windows密码。

  • Edge浏览器的安全改进

    屏蔽了传统的ActiveX/BHO/Toolbars的扩展以及一些过时的组件如VBScript,减少了尤其是第三方控件引入的攻击面。

    启用了全64位进程和增强保护模式沙箱保护(IE11默认仅使用32位进程和保护模式沙箱)。

    渲染引擎核心也增强了针对过去较多影响IE浏览器的一些漏洞的防护或缓解能力。

  • 内核模式字体引擎的安全改进

    将内核模式字体引擎部分分离并放入隔离的用户模式环境中运行(即UMFD机制, User Mode Font Driver,用户模式字体驱动), 有效防止了通过字体漏洞直接入侵Windows内核的攻击方式,同时也增加了可以通过组策略禁止或审计非系统字体加载的功能。

  • CFG(控制流保护/执行流保护)内存保护机制

    Control Flow Guard(CFG) 技术是Win 10中开始默认启用的一种抵御内存泄露攻击的新机制(后来被Win 8.1 Update 3补丁加入),用以弥补此前不完美的保护机制,例如地址空间布局随机化(ASLR)导致了堆喷射的发展,而数据执行保护(DEP )造成了返回导向编程(ROP)技术的发展。

    CFG是一种编译器和操作系统相结合的防护手段,目的在于防止不可信的间接调用。漏洞攻击过程中,常见的利用手法是通过溢出覆盖或者直接篡改某个寄存器的值,篡改间接调用的地址,进而控制了程序的执行流程。 CFG通过在编译和链接期间,记录下所有的间接调用信息,并把他们记录在最终的可执行文件中,并且在所有的间接调用之前插入额外的校验,当间接调用的地址被篡改时,会触发一个异常从而让系统介入处理。

  • 沙箱( Sandbox)

    专用于执行潜在的危险软件和应用,使其无法触及主机操作系统或内核。Windows 10 Insider预览版19H1提供了该功能。要求主机基于AMD64架构,且BIOS启用虚拟化功能,系统版本也必须是 Windows 10 Pro或Windows 10 企业版。用户无需下载虚拟机通常要求的虚拟硬盘,只需拥有一个已安装有Windows 10的副本即可。

Windows核心安全机制

Windows系统基础原理

系统架构

基本结构
image-20250609155120036

现代操作系统(包括Windows和Linux)都包含用户模式和内核模式两个模式;对于Windows 9x系统,其没有用户态和内核态这样子的划分。

image-20250609155738784

Windows在开发过程中是与Intel的CPU深度绑定的,Intel将CPU的模式分为从Ring 0 到Ring 3(从内到外,权限从高到低),而Windows支持Intel的两种处理器模式:

  • 内核模式:Ring 0
  • 用户模式:Ring 3

两个态的区别与联系在:

  • 内核模式下的代码可以访问所有的内存空间;可以直接操纵硬件
  • 用户模式下的代码无权访问系统空间的内存页面;无法直接操纵硬件。
  • 用户模式向内核模式的切换是受控制的。

什么是所有的内存空间

以32位系统为例,其能够访问的最大内存大小位232=4GB2^{32}=4GB,这4GB被均分为用户空间(低位)和系统空间(高位),如下图:

image-20250609160343975

用户模式只能访问自己的2GB,而内核模式可以访问全部的4GB。

对于64位系统而言,其用户模式和内核模式都能访问8192GB的内存空间,进而使得堆喷射等攻击方式无效,因此64位系统相比32位系统更安全。

操纵硬件怎么做?

硬件通过驱动程序来驱动,而驱动程序运行在内核态,主要是因为内核态可以访问所有的内存空间。


用户模式下的代码模块
image-20250609161529941
  • 系统支持进程(System support processes)

    Windows开机自动启动的系统内建服务进程,如负责用户身份验证的winlogon,会话管理的smss等。这个进程一旦开机就不能停止。下面是一些重要的系统进程:

    • Smss.exe:会话(Session)管理器,系统启动时第一个运行的进程。一般来说,系统的程序都在会话0里,用户的程序在会话1里,如果接个远程桌面,那远程的程序就在会话2里,会话之间是相互隔离的,这个特性是从Windows Vista后开始有的。
    • Csrss.exe:Windows子系统进程,即客户端/服务器运行进程。
    • Winlogon.exe:处理交互式登录。不过这个进程只负责图形化展示登录界面。
    • Services.exe:服务控制管理器, 负责启动、 停止、暂停和恢复服务。具体可在服务中看这个程序的作用
    • Svchost.exe:共享进程服务的宿主进程。很多服务用一个进程。
    • Lsass.exe:本地安全授权子系统,验证用户登录、授权和审计。

    可见系统支持进程

  • 服务进程(Service processes)

    通过Windows的服务管理机制所启动的一系列系统及网络服务,如自动更新服务,计划任务服务、打印后台处理服务、 事件日志服务等。此进程可以被创建、删除、开启、停止。

    可见服务

  • 用户应用软件(User application)

    在用户态执行的各类用户应用软件。

  • 环境子系统服务进程(Environment subsystems)

    为操作系统运行环境提供支持的服务进程,如Win32(即csrss进程)、Posix、 OS/2等。

  • 核心子系统DLL(Subsystem DLLs)

    kernel32.dlluser32.dllgdi32.dlladvapi32.dll动态链接库文件,作为用户态代码和系统内核的交互接口,将用户态代码调用的API函数映射到相应的一个或多个Windows内部的系统服务调用。

    用户的应用软件和系统的服务进程都要通过核心子系统DLL和内核打交道。

    不过,核心子系统DLL也并不是直接与内核交互,而是再经过一个NTDLL.DLL才传进内核。

    何为动态链接

    链接分为静态链接和动态链接,静态链接就是直接把包含的代码写进项目中,最后打包出一个exe程序;动态链接就是程序可以动态调用DLL中的函数。

    DLL和exe都是PE格式的文件,他们俩的唯一区别就是DLL不能单独运行起来,DLL不是执行的入口点程序,它需要其他exe去加载它。

内核模式下的代码模块
image-20250609163235177
  • Windows执行体(Executive)

    包含了基本的操作系统服务, 比如进程与线程管理、内存管理、 I/O管理、网络和进程间通信以及安全服务等。

  • Windows内核体(Kernel)

    实现了底层的操作系统功能,如线程调度、中断和异常调度、多处理器同步等; 还提供了一组例程和基本对象,供其余的执行体来使用。

  • 设备驱动程序(Device drivers)

    既包括硬件设备驱动程序(将用户I/O函数调用转换为特定的硬件设备I/O请求),也包括非硬件设备驱动程序(如文件系统和网络驱动程序) 。

  • 硬件抽象层(HAL, Hardware abstraction layer)

    将内核、驱动程序和执行体其余部分与特定于平台的硬件差异隔离开来。

  • 窗口和图形系统(Windowing and graphics)

    实现了图形用户界面(GUI) 函数(通常称为Windows用户和GDI功能), 包括窗口的处理、用户界面控制以及绘制等。


总结一下上面说到的代码模块,Windows的核心系统组件如下:

  • NtOsKrnl.exe:执行和内核,负责操作系统的基础运行。

  • NtKrnlpa.exe (仅限32位系统):执行和内核,带有物理地址扩展 (PAE) 支持,允许32位系统访问高达64 GB的物理内存,并可以将内存标记为不可执行。

  • Hal.dll:硬件抽象层,负责与硬件交互。

  • Win32k.sys:Windows 操作系统中的一个核心内核驱动程序,全称为 Windows 32-bit Kernel Driver,主要负责 图形用户界面 (GUI) 和 窗口管理 的核心功能。

  • Ntdll.dll:提供内部支持函数和系统服务分派存根到执行层。

  • Kernel32.dll, Advapi32.dll, User32.dll, Gdi32.dll:Windows子系统的核心DLL文件,分别处理不同的核心功能。

Windows的应用程序(PE格式)

Windows的可执行程序都满足PE格式,主要有下面几种:

  • EXE:可执行程序,包括DOS可执行程序和32位/64位的PE格式可执行程序。
  • DLL:动态链接库(Dynamic-link library)程序。
  • OCX:即ActiveX 控件,本质上还是DLL。
  • SYS:驱动程序,是能加载到内核态的唯一的程序。
  • OBJ:编译器创建的对象文件,作为链接器的一个输入。

可执行文件的PE格式:

  • Windows的可执行文件格式为PE(Portable Executable),也就是可移植执行的意思。
  • PE和ELF(Linux中的文件格式)同根同源,都是从COFF ( Common Object File Format,通用对象文件格式)发展而来。
  • PE文件被装载时直接映射到进程的虚拟空间中运行,它是进程虚拟空间的映像,因此也被称为映像文件。
  • PE相比COFF,多了两个主要的变化:
    • PE的开始部分多了IMAGE_DOS_HEADERDOS_Stub(桩代码),如下图中最上面,PE格式的可执行文件开头是"MZ"。
    • COFF中的IMAGE_FILE_HEADER被扩展成为IMAGE_NT_HEADER,具体扩展的就是IMAGE_OPTIONAL_HEADER这个结构体,里面的EXPORTIMPORT表示导出和导入的库,RESOURCE是资源文件(例如图标这种),SECURITY是数字签名信息,COPYRIGHT是版本信息、哪个公司做的(这个可以随便改)。
Windows的API(应用编程接口)函数与.NET框架

Windows的API函数是操作系统用户模式下的接口,被若干个DLL文件导出: kernel32.dll(kernel32.dll会再调用kernelbase.dll)、 user32.dll、gdi32.dll;几个示例函数:CreateFileReadFileOpenProcessTerminateProcess,API函数在逻辑上被分为很多个子类:

  • Administration and management(系统管理)
  • Diagnostics(系统诊断)
  • Graphics and multimedia(图形和多媒体)
  • Networking(网络)
  • Security(安全)
  • System services(系统服务):进程、线程、注册表、文件等
  • Windows UI( Windows图形化界面)

.NET框架建立于Windows的这些API函数之上,其包含一个被称之为FCL(Framework Class Library) 的类库,一个**“公共语言运行时” (CLR, Common Language Runtime)** ,提供受管理的代码执行环境,包含实时编译、类型检查、垃圾回收、代码访问安全等特性。

CLR作为一个传统的COM服务器形式实现,代码依赖于标准的用户模式Windows DLL提供的不受管理的API函数。.NET框架没有任何代码运行在内核模式下。

image-20250609211514057
原始API函数

未文档化(Undocumented)的接口,被Ntdll.dll所导出;被若干操作系统重要的进程所使用(如smsscsrss等)。几个示例函数:NtQuerySystemInformationNtSetSystemInformationNtQueryDirectoryFileNtCreateFileNtReadFileNtOpenProcessNtTerminateProcess等,他们头上都是带Nt的。

系统服务派遣
image-20250609212428311

系统服务派遣是进到内核态后的第一步,下面详细说一下从用户态到内核态每个API被调用时发生了什么。

image-20250609213400965

左侧是内核API函数的运行流程:

  • 应用程序调用WriteFile函数
  • WriteFile函数在核心子系统DLL中的Kernelbase.dll中,然后Kernelbase.dll会去调用Ntdll.dll中的NtWriteFile函数
  • Ntdll.dll通过SYSENTER这个中断进入内核态
  • 在内核态中调用执行体中的Ntoskrnl.exe中的NtWriteFile函数(这个和Ntdll.dll中的NtWriteFile函数不同,是由Ntoskrnl.exe所实现的)
  • Ntdll.dll中的NtWriteFile怎么映射上Ntoskrnl.exe中的NtWriteFile就是系统服务派遣的工作,是通过系统服务派遣表(SSDT表)实现的。

至于下面在Ntoskrnl.exe中的NtWriteFile后怎么更深入到底层的驱动程序,见IO系统与驱动

管理机制

注册表

包含操作系统和其它软件的所有设置和配置相关数据的目录。注册表的逻辑结构类似于磁盘上的文件系统。注册表包含子键(key)和值(value)。其中键类似文件系统中的目录,而值就像文件,键可以包含子键(subkey)和值。值中存储着配置数据,数据有多种类型。**最顶层的键称为根键(root key)or 主键。**在内存中包含有“易变”的数据,比如当前的计算机和用户配置。

注册表的根键如下:(有的电脑上没有HKPD这一项)

image-20250609225107868
  • HKEY_LOCAL_MACHINE:整个计算机的设置,只有管理员及以上的权限可以修改,不是链接。
  • HKEY_USERS:所有用户的配置,下面各个子键是各用户的SID。
  • HKEY_CURRENT_USER:是链接,是关联HKEY_USERS下当前登录用户的子键。当前登录用户能够改自己HKEY_CURRENT_USER下的配置。

注册表其实是以磁盘上的**Hive(储巢)**文件进行存储的,大多数位于%SystemRoot%\System32\Config目录中。HKLM\SYSTEM\CurrentControlSet\Control\Hivelist中列出了注册表键和Hive文件的对应关系。

服务

服务程序是后台运行的进程,常用来执行特定的任务,不需要和用户进行交互。包括自动更新服务、后台智能传输服务、事件日志服务等。

服务程序受**Service Control Manager(SCM,即services.exe进程)**所控制。服务程序的配置数据位于HKLM\System\CurrentControlSet\Services,在这个注册表中,每个服务对应的参数有Start(启动类型)、Displayname、Description、ObjectName(对象名称,就是谁开启服务的,一般有LocalService和NetworkService两种,分别对应本地和网络的,其区别就在能否访问网络)、Type(服务种类)、ImagePath(可执行文件路径)

  • 服务程序的种类(Type)

    内核态的服务:内核驱动( Kernel driver)服务(type为1)、文件系统驱动(File System Driver) 服务(type为2)

    image-20250610005222832

    内核态服务的ImagePath都是在drivers目录下的sys驱动文件;如果该服务没有ImagePath参数,则ImagePath默认为:服务名.sys

    用户态的服务:独立进程(Separate process)服务(type为16)、共享进程(Shared process)服务(type为32)

    独立进程服务即该服务启动时会开启一个新进程,一个服务一个进程;

    共享进程服务即同种类型或同样权限的服务放进一个进程里,进程名为Svchost.exe

    image-20250610000023332

    两者的不同点也可以从ImagePath看出,独立进程的ImagePath(第一行)就是其运行的进程名;共享进程则是基于Svchost.exe-k参数后是模块名,同一模块中的不同服务通过下面那个dll来区分。

  • 服务的启动类型(Start):自动( Auto,start为2)、手动( Demand,start为3)、禁用( Disable,start为4)

    对于内核态的服务而言,还存在下面两种启动方式:

    image-20250610005923227
  • 服务的基本信息:显示名称(DisplayName)、服务描述(Description)、可执行文件路径(ImagePath)、登录身份账户(ObjectName)

进程与线程

进程

进程是一个应用程序运行的实例。

进程包含以下一些基本组件:

  • 私有虚拟地址;
  • 可执行体程序;
  • 被操作系统分配的一份资源句柄(Handles,指向对象的指针)列表,这些句柄指向该进程可以访问的各种系统资源。
  • 访问控制令牌(Token),用以唯一的标识所有者及其所属组以及和该进程相关联的特权(Privilege)信息
  • 进程标识号;
  • 一个或多个线程,一定要有一个主线程,其余线程进行并发处理。
线程

线程是CPU调度执行的基本单元。

线程包含以下一些基本组件:

  • CPU状态:初始、就绪、延迟就绪、备用、运行、等待、转换、终止等;
  • 两个栈:分别用于内核模式和用户模式;
  • 线程本地存储(TLS):私有存储空间,用来保存子系统、运行时库以及DLL文件等;
  • 线程标识号;
  • 访问控制令牌(Access Token),用以唯一的标识所有者及其所属组以及和该线程相关联的特权( Privilege)信息
进线程关系与数据结构
image-20250610012328942

默认情况下,进程下的所有线程都共享和进程一样的访问控制令牌;但是如果该线程是在帮其他进程做事,那它也会有自己的新的访问控制令牌,即模拟访问控制令牌。(模拟别的进程的身份)


  • 每个Windows进程都是由一个执行体进程块(EPROCESS)来表示,包含与进程有关的属性及其他的相关数据结构(一个或者多个线程)。
  • 每个线程由执行体线程(ETHREAD)块来表示。
  • EPROCESS与其相关的数据结构大部分位于系统地址空间(内核态)中, 除了PEB(进程环境块)和TEB(线程环境块)位于进程地址空间(用户态)中。

内存管理

内存管理器:每个进程都有属于它的巨大的、连续的私有内存地址空间(即虚拟地址)。

内存管理器的功能:

  • 将虚拟的私有内存翻译/映射到真正存放数据的物理内存, 可以隔离不同进程之间的数据读写。
  • 当物理内存耗尽时,将内存换页( page)到磁盘上去;然后当需要时再换页回来。

虚拟内存(Virtural Memory):每个进程都有它自己的虚拟地址空间。虚拟内存提供了和物理内存不相关的逻辑视图。

换页(Paging)是和磁盘传输内存内容的过程。虚拟内存的大小可以超过可用的物理内存。

IO系统与驱动

Windows的IO系统组件包括输入输出管理器( I/O Manager)、即插即用管理器(Plug and Play/PnP Manager)、电源管理器( Power Manager)等,在这里关注输入输出管理器。

输入输出管理器( I/O Manager)接收应用程序的请求后,创建相应的**IRP(I/O request packets,输入输出请求数据包)**并传送至驱动程序进行处理,驱动程序可能有以下几种操作:

  • 根据IRP的请求,直接操作具体硬件设备,然后完成此IRP,并返回。
  • 将此IRP的请求,转发到更底层的驱动程序中去,并等待底层驱动的返回。
  • 接收到IRP请求后,不是急于完成,而是分配新的IRP发送到其他驱动程序中去,并等待返回。

仍然以ReadFile为例,其更深入的流程如下:

image-20250610153350755

驱动程序也是分层的:

image-20250610153937214

上图中写文件需要先使用文件系统驱动,再使用磁盘驱动来完成。同样,如果有多块磁盘,则还需要加入一个卷管理的磁盘驱动:

image-20250610154105981

文件系统

Windows支持以下几种文件系统格式:

  • CDFS:适用于CD的只读文件系统。
  • UDF:适用于DVD的只读文件系统。
  • FAT12, FAT16, FAT32:File Allocation Table,文件分配表文件系统。不过不支持访问控制,且对存储文件的大小有限制。
  • NTFS:New Technology File System, Windows NT以及之后Windows的标准文件系统

NTFS是一种日志记录系统,其中的文件更改会被载入正式记录。其主要组件是主文件表(MFT),其存储必要信息以便从分区找回文件。此文件系统还包括主文件表副本,当在初始表发生问题时可发挥作用。其具有如下特性:

  • 单文件大容量: > 4G
  • 长文件名:>255个字符
  • 基于Unicode的命名方式
  • 访问控制(Access control)
  • 磁盘配额(Disk quotas):防止单用户占用磁盘空间太多
  • 加密文件系统(Encrypting File System, EFS)
  • 支持多重数据流(Multiple data streams)
  • 支持硬链接和联结点(Hard links and junction points)

域和活动目录

Windows系统的网络组织形式有两种形式:

  • 工作组(Workgroup):主机之间角色平等,没有上下层级关系;主机数量较多时,管理和安全防护工作将会及其混乱。
  • 域( Domain):域是一个有安全边界的主机集合。一个域中的主机用户无法访问另一域中的资源。域有集中的身份验证、权限控制和安全策略管控机制。

域的逻辑结构:

  • 单域:对象、组织单元/单位(OU)(容器对象,是域中对象的逻辑组合)
  • 域树:具有连续名称空间的多个域通过建立信任关系而形成的层级结构,分为父域和子域
  • 域森林:一个或多个没有连续名称空间的域树通过建立信任关系组成的集合

例如:A集团(域森林)->甲、乙、丙等子公司(域树)->财务科、人事科等部门(域) ->员工(对象)

活动目录

活动目录(Active Directory, AD):

  • 目录是一种存储网络对象(包括用户、组、计算机、共享资源、打印机和联系人等)信息的层次结构; 目录服务是指帮用户快速、准确地从目录中查找到所需信息的服务。
  • 活动目录为域实现了目录服务,提供了网络环境的集中式管理机制。
  • 在活动目录中,管理员不需要考虑被管理对象的地理位置,而只需要按照一定的方式将这些对象放置到不同的容器之中。
  • 活动目录是Microsoft提供的统一管理基础平台,众多服务(ISA防火墙、 Exchange邮件收发、 SMS系统管理等)都依赖它。
域控制器
  • 域控制器DC是整个域的管理和通讯中枢,负责所有接入域的计算机和用户的身份验证、权限控制。
  • DC存储域范围内的所有目录数据信息,包括用户账号信息、身份验证信息(比如密码散列),安全策略。
  • 在一个域中,可以有多个域控制器来分担用户登录、信息检索等操作。多个域控制器之间能够互相同步和复制数据
  • Windows服务器安装活动目录(AD)后就变成了域控制器
域中主机的类型
  • 域控制器
  • 成员服务器
    • 加入域, Server版Windows系统,没有安装活动目录
    • 主要任务是提供网络资源和应用服务,比如文件服务器、邮件服务器、数据库服务器、 Web服务器,远程访问服务器、打印服务器等。
  • 客户机
    • 加入域,其他操作系统,普通客户主机;
    • 使用域帐户和身份验证机制登录到域后,就可以使用活动目录提供的各种服务,访问域中的各种资源,但同时也被强制接受管理员设置的统一安全管理。
  • 独立服务器
    • 没有加入域,也没有安装活动目录
    • 可以创建工作组,与网络中其它计算机共享资源,但不能使用活动目录提供的任何服务。

Windows系统安全组件

组件架构图

image-20250610171415127

上图展示了系统安全的几个重要组件,其中Winlogin和LogonUI是登录前端,后端服务是Lsass,其外挂了两个服务dll(身份认证程序包),周围还有3个数据库。

本地安全授权子系统LSASS

Lsass.exe映像文件的用户态进程,负责本地系统安全策略、用户认证,以及发送安全审计信息到事件日志。其具有如下功能:

  • 用户身份验证和权限管理:负责交互式身份验证,验证后生成安全访问令牌,令牌中含有用户特权信息;确定用户权限(权限和特权不一样)
  • 安全策略管理:管理本地安全策略、管理审核策略
  • 对象管理:建立可信任域列表、内存的配额管理

安全参考监视器SRM

是Windows执行体ntoskrnl.exe(内核态) 的一个组件,负责执行对象的访问控制、管理特权(用户权限)以及生成所有的安全审计信息。(它不干身份认证登录这块)具体功能如下:

  • 访问控制和特权管理:根据LSA配置的安全访问控制策略,联合对象管理器(ObjectManager),负责对所有安全主体访问Windows资源对象的授权访问控制。
  • 安全审计:根据LSA配置的安全审计策略,对访问过程中关注的事件进行记录,并由事件日志服务生成系统审计日志。

LSASS策略数据库

包含本地系统安全策略设置的数据库,数据库存储在注册表HKLM\Security子键下面,包含:

  • 哪些域是可信任的,从而可以认证用户的登录请求;
  • 谁允许访问系统,以及如何访问(交互式登录、网络登录,或者服务登录);
  • 分配给谁哪些特权;
  • 执行哪一种安全审计;
  • 域登录在本地缓存的信息;
  • Windows服务的用户-账户登录信息;

Windows系统身份认证

账户标识SID

Windows使用安全标识符SID来唯一表示安全主体,包括用户和组。 Windows NT 6.x中,系统服务也有SID标识。

用户的SID的格式为:S-R-X-Y1-Y2…Yn-1-Yn,其含义如下:

  • S:表示该字符串为一个SID。

  • R:表示SID结构的版本号。 Windows系统中都为1。

  • X:表示标示符颁发机构

    • Windows特定的账户/组,如Administrators,该值为5(SECURITY_NT_AUTHORITY)。
    • Everyone等通用的账户/组,该值为1(SECURITY_WORLD_SID_AUTHORITY)。
  • Y1-Yn-1:表示子级颁发机构,标识各级不同的域。这个是随机生成的。

    • Administrators组的域标识符是32(Builtin)。
    • Everyone组没有域标识符。
  • Yn:表示域内特定的账户和组,也叫相对标识符(RID)

    image-20250610174837091
    • Administrators组的相对标识符是544。
    • Administrator的相对标识符是500, Guest是501。
    • Everyone组的相对标识符为空。
    • RID为502的Krbtft只有在DC(域控制器)上有

服务的SID:从Windows Vista/Server 2008(NT 6.0)开始,每个服务程序都有自己的SID,而账户的名称则为NT SERVICE\<服务名称>

image-20250610175709065

身份认证登录

登录概述图
image-20250610180759447

身份验证这块前后端间的通信是通过ALPC来完成。Windows NT 5.x和Windows NT 6.x 内核在身份认证这块存在不同,不过主要的差异点是在Winlogin、LogonUI前端这块。

Windows NT 5.x 身份交互式登录验证组件
image-20250610190026477

Winlogon进程:

  • 可信任的进程,负责管理与安全有关的用户交互
    • 协调登录过程,在登录时启动用户的第一个进程,处理注销过程,以及管理其他各种与安全有关的操作,包括在登录时输入口令、更改口令、锁住/解锁工作站等。
    • 创建可用的桌面。
    • 向操作系统注册一个安全维护序列( SAS, Secure AttentionSequence),默认为Ctrl+Alt+Delete
    • 维护工作站状态。(很久不输入没动作就锁定)
    • 实现超时处理。
  • GINA发送事件通知消息,提供可供GINA调用的各种接口函数。
  • 保证其操作对其他进程不可见,从而防止登录密码等信息被截获。

GINA动态链接库:

  • 提供了Winlogon用户标识和验证用户的输出函数。
  • 默认的GINA是%systemroot%\system32\Msgina.dll
  • 允许被用户替换来自行定制系统的用户识别和身份验证。(比如指纹、人脸等多因子认证方式,当然这样自由替换也导致了安全性问题,NT6.0以后就没有这东西了)

身份验证程序包:

身份验证程序包的任务是验证用户;向LSA返回验证成功用户的SID,用以绑定到用户安全令牌中(由LSA拿着用户的SID去查询安全策略数据库SECURITY,知道这个用户有什么特权,再生成访问控制令牌)。

身份验证程序包位于DLL动态链接库中,在系统启动期间被LSA所链接,接受输入的登录证书,通过验证程序决定是否允许用户登录。

Windows安装的身份验证程序包:

  • 独立(工作组)环境: MSV1_0,%SystemRoot%\System32\Msv1_0.dll
  • 环境: Kerberos, %SystemRoot%\System32\Kerberos.dll
  • 当用户以交互方式登录到本地计算机上时,或者当没有域控制器可以访问时, Windows使用MSV1_0作为认证包;
  • 当用户以交互方式登录到一个域中时, Windows使用Kerberos作为认证包。

**SAM安全账户管理器:**本地账户信息存储在SAM文件/注册表中

**Active Directory活动目录:**域账户信息存储在域控制器( DC)上的活动目录中

New Process新创建的进程:

  • 先启动用户初始化进程, %SystemRoot%\System32\userinit.exe
  • 由userinit调用用户外壳进程, %SystemRoot%\explorer.exe,然后userinit就关掉了

**Netlogon网络登录服务:**一种Windows服务,用以创建和域控制器之间的安全通道,发送安全请求,既支持LM/NTLM的身份验证,也支持活动目录登录。其动态链接库位于%SystemRoot%\System32\Netlogon.dll

Windows NT 6.x 身份交互式登录验证组件
image-20250610191223931

LogonUI登录用户接口:

  • 为保护Winlogon进程不崩溃, LogonUI由Winlogon按需启动, 真正加载Credential provider,为用户提供验证身份的图形界面。
  • LogonUI是用户模式下的进程,即%SystemRoot%\System32\LogonUI.exe

Credential provider凭证提供者:

  • 是运行在LogonUI进程内的COM对象,位于一些DLL文件中(触发SAS热键后由Winlogon按需启动),用来获取用户的用户名、密码、智能卡PIN码或者生物数据(比如指纹、视网膜信息)。
  • 标准的CP是%SystemRoot%\System32\authui.dll%SystemRoot%\System32\SmartcardCredentialProvider.dll
image-20250610193139634

安全账户管理器(SAM)及数据库

SAM服务与SAM数据库

SAM(Security Account Manager)服务:运行在LSASS进程中的一组子例程, 负责管理SAM数据库,即Windows用户账户数据库的控制与维护。

SAM数据库:

  • 位于受到保护的注册表及对应的磁盘文件中。系统运行期间被SYSTEM帐号锁定,即使是Administrator帐号也无法打开、删除和复制。
  • SAM数据库包含了所有的用户账户、组账户信息以及每个用户密码的两个加密散列值
    • LM(LAN Manager)密码散列,Windows Vista之后默认都不再保存LM散列。
    • NTLM(NT Lan Manager)密码散列
SAM数据库的加密保护

对用户的密码有下面两种散列方式:

LM散列算法:

  • 如果明文密码不足14位,就用0x00把密码补足14位,如果超出14个字节,则取前14个字节。
  • 将密码的所有字母转成大写字母,然后分为两个部分,每部分7个字节。
  • 将每部分的7个字节(56bit)的每7bit后面添加1bit的0,从而扩充为64bit作为DES的密钥。然后使用该密钥来加密魔法字符串“KGS!@#$%”,分别得到两个8字节的密文,最后将这两部分密文合并得到最终的16字节密码散列。

NTLM散列算法:将密码转换成UNICODE字符形式,然后使用MD4算法进行散列运算。

同时,SAM数据库自身也进行了加密,存在syskey这种加密工具,这个加密给用户提供下面几个选项:

  • 密码启动:自己指定解密SAM所需的密码,这样每次启动系统时需要输入密码。
  • 在软盘上保存启动密钥:每次启动时需要插入这张软盘。
  • 在本机上保存启动密钥:默认设置
SAM数据库的注册表分析

image-20250610200633173

注册表HKLM\SAM\SAM\Domains\下就是域(或本机)中的SAM内容,包含“Account” 和“Builtin” 子键。

  • \Domains\Account是用户帐号内容。
  • \Domains\Account\Users下就是各个帐号的信息。其下的子键就是各个帐号的SID相对标志符,即RID。比如000001F4(十进制为500)是Administrator的RID。每个帐号下面有两个值, F和V。
    • **“V”**中保存的是账户的基本资料,用户名、用户全名、所属组、描述、密码散列(经过额外的加密保护)、注释、是否可以更改密码、账户是否启用、密码设置时间等。
    • **“F”**中保存的是一些登录记录,比如上次登录时间、错误登录次数等,还有一个重要的地方就是这个帐号的RID。
  • \Domains\Account\Users\Names下是用户帐号名,每个帐号名只有一个默认的子键,类型不是一般的注册表数据类型,而是这个帐号的RID值,比如Administrator的类型为0x1F4。
账户密码的破解方法

SAM文件的获取方法:

  • 物理接触主机、启动其他操作系统( PE系统)来获取Windows分区上的%SystemRoot%\system32\config\sam文件。
  • 使用pwdump、 wce、 gsecdump、 copypwd等工具从Lsass内存或者注册表中导出SAM散列值,转储成类Unix系统的passwd格式文件。

**Windows本地密码散列导出工具:**Pwdump, wce, gsecdump, copypwd, QuarksPwDump

**Windows本地已登录账户的明文密码提取工具:**mimikatz, wce

**Windows本地密码破解工具:**L0phtCrack, SAMInside, Ophcrack、

彩虹表破解 :RainbowCrack( 一种“以空间交换时间”的技术)

由于LM/NTLM散列算法没有Salt机制,因此可以通过事先计算出所有可能密钥的加密值并存储成一张表,解密时只需在该表中进行搜索即可。时间可以缩短至几秒至几分钟。结合GPU硬件破解,更可以大大缩短破解时间。

身份验证协议

image-20250610202730560
LM和NTLM身份验证协议

Windows固有的身份验证协议(不用于其他操作系统)。

在Windows非域环境中采用,包括:

  • 工作组环境。
  • 域环境,但是客户端或者服务器不是域成员。

基于“Challenge/Response”( 质询/响应)模式的验证协议,仅提供单向验证

用户向服务器发送的东西的变化过程:

  • Windows Server 2003之前:默认“发送LM和NTLM响应”。
  • Windows Server 2003:默认“仅发送NTLM响应” 。LM/NTLM响应:在16字节的LM/NTLM Hash值后面加上5个空字节,总共21个字节,然后平均分割成三个7字节, 再进行拼接而成三个8字节,分别对8字节的Challenge进行DES加密计算,最后得到24字节的Response。
  • Windows Vista/7/Server 2008:默认“仅发送NTLM v2响应”。NTLM v2: NTLM的改进版,使用NTLM Hash值(NTOWF),在计算时还包含一个客户端的Challenge。
  • 协商支持NTLMv2会话安全(NTLMSSP, NTLM++):NTLM Session Security,安全性介于NTLM和NTLMv2之间;只要服务器支持,则协商一致后采用,现在实际上基本都采用这种级别的身份验证协议。
Kerberos身份验证协议

Kerberos协议起源于美国麻省理工学院Athena项目。基于公私钥加密体制为分布式环境提供双向验证。

Kerberos是Windows域环境中的默认身份验证协议,满足用户的单一登录特性(Single Sign On)。

Kerberos协议是一个基于票据(Ticket)的系统。客户通过网络向Kerberos密钥分发中心(KDC)进行身份验证并请求票据用以访问网络应用资源。

Kerberos密钥分发中心( KDC)提供的服务:

  • 身份验证服务(AS, Authentication Service):对用户进行验证,发行TGT(Ticket Grant Ticket, 票据授予票据),该票据供用户后续求会话票据之用。
  • 票据授予服务(TGS, Ticket Grant Service):在发行给客户的TGT的基础上,为应用服务发行ST(Service Ticket, 会话票据) /TGS

Windows系统访问控制与授权

目的与本质

访问控制的目的是:限制安全主体(用户、进程、服务等)对客体(文件目录、注册表键等)的访问权限,从而使系统在安全合法范围内使用。

访问控制的本质就是把安全主体的访问令牌客体的安全描述进行比较。

  • 用户成功登录时,系统的本地安全授权(LSA)为其创建访问令牌。
  • 用户启动程序创建进程时,线程获取该令牌的拷贝。
  • 用户程序请求访问客体时,向系统提交该令牌。
  • 系统使用该令牌与客体的安全描述进行比较来执行访问检查和控制。
image-20250610210001401

主体的安全访问令牌

访问令牌内容
  • 用户帐号SID(User account SID),由身份验证数据包向LSA返回
  • 用户所属组的SID(Group 1-n SID)
  • 受限SID ( Restricted SID 1-n)
  • 会话ID ( Session ID):所属会话的ID
  • 特权列表( Privilege1-n):与该令牌关联的特权列表
  • 源( Token Source):创建此令牌的实体,比如会话管理器、网络文件服务器,或者RPC服务器等。
  • 完整性级别(Integrity Level):Windows Vista开始引入,用以限制读取/写入对象的范围。
  • 默认自主访问控制列表( Default DACL):用以创建对象时为其设置的初始DACL。
  • 令牌类型(Type):主令牌(primary)还是模拟( impersonation )令牌。
  • 模拟级别(Impersonation Level)
  • 令牌标记( Flags) 和强制策略( Mandatory Policy):决定UAC和UIPI机制的行为表现。
  • 默认主安全组(Default primary group)
令牌类型
  • 主令牌(Primary Token)每个进程都有一个主令牌来描述与该进程相关的用户帐号的安全上下文。

  • 模拟令牌(Impersonation Token)

    • 服务进程在自己的帐号下运行,使用自己的主令牌,但当服务接受一个客户的访问请求时,它创建一个线程来完成这项工作并将客户的访问令牌与工作线程相关联。客户的访问令牌是一个模拟令牌,用来标识客户、客户的组和特权。
    • 当线程代表客户请求访问资源(比如文件、打印机、数据库等)时,在访问检查过程中使用该信息。在模拟结束后,线程重新使用主令牌并返回到服务自己的安全上下文里操作。
    • 服务器只能在发起模拟请求的线程内模拟客户。

    为了防止滥用模拟机制, Windows不允许服务器在没有得到客户同意的情况下执行模拟。客户进程在连接到服务器的时候可以指定一个安全服务质量,以此来限制服务器进程可以执行的模拟级别

    • SecurityAnonymous级别:最为受限制,服务器不能模仿或者识别出客户。
    • SecurityIdentification级别:允许服务器得到客户的SID和特权,但不能模拟该客户。
    • SecurityImpersonation级别:默认级别,允许服务器在本地系统上识别和模拟该客户。
    • SecurityDelegation:最为随意,允许服务器在本地系统或远程系统上模拟该客户。
受限制的令牌(Restricted Token)

出于安全原因,应用程序可创建一个受限的令牌并将它分配给子进程或模拟线程来为它们创建受限的安全上下文。

受限令牌在主令牌或模仿令牌的基础上创建的,来源于令牌的拷贝,但可能进行如下修改:

  • 从该令牌的特权列表中删除一些特权;
  • 该令牌中的SID被标记为仅仅拒绝( Deny-only);只能用来判断访问控制项也是Deny的项
  • 该令牌中的SID被标记为受限制的( Restricted);

在进行对象访问检查的时候,系统要执行两次访问检查: 一次使用令牌的“Enable SID”和“Deny SID” ,另一个使用Restricted SID的列表。只有当这两个访问检查都允许请求的访问权限时才能允许访问。

例如被过滤的管理员令牌( UAC权限提升之前):

  • 完整性级别被设置为中等;
  • 除了Change Notify、 Shutdown、 Undock、 Increase Working Set、Time Zone以外的其他特权都被去掉了;
  • 给管理员以及类管理员的SID标记“Deny-only”,可以消除以下安全缺陷: 比如某个文件拒绝管理员组用户的访问,但允许其他包含这个管理员用户的组的访问,这将会导致这个用户最终能够访问该文件;
账户权限和特权

进程在运行过程中执行的许多操作是无法通过对象访问保护来授权控制的,因为这些操作并没有与一个特定的对象打交道。Windows使用特权(Privilege)和账户权限(Account Right), 以使得管理员可以控制哪些账户能够执行与安全相关的操作。

特权是指一个账户执行某个与系统相关的操作的权限,比如, 关闭计算机或者改变系统的时间。

  • 与用户权限不同,不同的特权是由不同的组件来定义的,并且也是由这些组件来强制使用的。 比如调试特权是由进程管理器来检查的,它使得一个进程在利用Windows API函数OpenProcess来打开另一个进程的句柄时可以绕过安全检查。
  • 与账户权限不同,特权是可以被允许和禁止的。 想让一个特权检查能够成功地通过,该特权必须出现在当前特定的令牌中,而且它必须是允许(Enabled)的。

账户权限则把“执行某一特定登录类型(比如本地登录或交互式登录到一台计算机上)的能力”授予它所针对的账户, 或拒绝分配给该账户。(账户权限不写进访问控制令牌里,它是与用户登录相关的操作)

  • 账户权限并不是由安全引用监视器( SRM)强制实施的,也不存储在令牌中。
  • 当一个用户企图登录到系统中时,作为对登录请求的响应,LSA从LSA数据库中获取到已赋予该用户的账户权限,对登录类型(交互式登录、网络登录、批作业方式登录、服务方式登录、终端服务登录等)进行检查,如果该用户的账户没有“允许此种登录类型”的权限,或者具有“拒绝此种登录类型”的权限,则LSA拒绝该用户的登录请求。
完整性级别

强制完整性控制( MIC , Mandatory Integrity Control):

  • Windows Vista之后开始引入,将进程分为不同的完整性级别,从而保证低级别的进程无法影响高级别的进程。
  • 进程的完整性级别由令牌中的SID声明。
  • 系统首先进行完整性级别的检查,然后再进行DACL的检查
image-20250610222551369

客体的安全描述

客体安全描述内容
  • 版本号(Revision Number)
  • 标志(Flags/Control)
  • 所有者的SID(Owner SID)
  • 所有者主要组的SID(Group SID),仅被POSIX使用,目前已废弃
  • DACL(Discretionary Access Control List)自主访问控制列表:规定谁可以用什么方式访问对象。
  • SACL(System Access Control List)系统访问控制列表:规定哪些用户的哪些操作应该被记录到安全审计日志中,以及对象的显式完整性级别。
image-20250610220604062

DACL和SACL都是ACL(访问控制列表),而ACL则是访问控制项(ACE)的有序列表,每个ACE中含有的信息有:

  • ACE大小(Size)

  • ACE标志(Flags)

  • ACE类型(Type)

    • DACL包含ACE的类型:访问允许、访问拒绝、允许的-对象、拒绝的-对象等。
    • SACL包含ACE的类型:系统审计、系统审计-对象
  • 用户SID

  • 访问屏蔽码(Mask):32位,每一位对应着该对象的访问权限,可设置为1(置位,

    表示授予相应操作允许或拒绝的访问权,即type里写的) 或0(未置位,未授予相应操作允许或拒绝的访问权)

访问控制项在列表中的顺序:

  • 直接设置(显式)的ACE在从父对象上继承下来的ACE前面;
  • 从第一层父对象继承下来的ACE在第二层父对象(祖父)上继承下来的ACE前面,以此类推;
  • 同一层中,拒绝类型的ACE在允许类型的ACE前面。
image-20250610220444809

用户权限控制

RunAs服务(辅助登录服务)

管理员平时使用标准的用户账户登录,然后在必要的时候调用具有更高权限的管理员控制台来执行管理任务。属于是UAC的前身(Vista之前)。

用户账户控制(UAC)

在Windows Vista之后的系统中,包括Windows 7、 8、 10等,需要管理员权限的操作标有一个盾牌图标,表示首先需要经过系统UAC的提升确认才能进行进一步的操作。

UAC其实就是一种特殊的“缩减特权”模式。

UAC权限提升对话框的颜色:

  • 红色背景,带有红色盾牌图标。该程序的发布者被禁止,或者被组策略禁止。
  • 橘黄色背景,带有红色盾牌图标。该程序不被本地计算机信任(不包含可信任的数字签名,或数字签名损坏)。
  • 蓝绿色背景。Windows自带的程序(包含微软的数字签名)。
  • 灰色背景。该程序带有签名且被本地计算机信任(带有信任的数字签名)。

没有经过UAC提升时受限的管理员令牌:

  • 管理员SID被标记为“Deny
  • 完整性级别为“Medium”,提升后就是High
  • 特权列表减少

大多数Windows可执行程序和控制面板组件并没有出现权限提升确认对话框,即便是需要管理员权限来运行。

自动权限提升的条件:首先必须是Windows发行商(不只是Microsoft)签名的Windows可执行程序,而且必须位于某几个被认为安全的目录中,比如%SystemRoot%\System32及其大多数的子目录,%Systemroot%\Ehome, %ProgramFiles%里的一小部分目录(比如包含Windows Defender和Windows Journal的目录);然后是“manifest”清单里包含“autoElevate”元素的exe文件。

image-20250610234905239

用户界面权限隔离(UIPI)

UIPI是UAC机制的一部分,目的在于防止窗口消息攻击。 主要针对主客体都是进程的时候。

通过结合完整性级别控制, UIPI具体所做的保护包括:

  • 低级别进程无法对高级别的窗口句柄做验证;
  • 低级别进程无法向高级别进程的窗口发送消息(SendMessage或PostMessage等) ;
  • 低级别进程无法把线程注入到高级别进程;
  • 低级别进程无法对高级别进程进行消息或日志挂钩
  • 低级别进程无法把DLL注入到高级别进程;
  • 低级别的进程不可以读取高级别的内存地址空间
文件和注册表的虚拟化

这里的虚拟化本质上是“重定向”操作; 某些老版本遗留下来的应用程序还需要往Windows系统目录中写入数据文件或者配置信息,那么Windows会自动将写入操作重定向到另外一个专用的文件夹,同时该程序读取相应文件夹时也将会被重定向; 注册表的虚拟化和文件的虚拟化类似。

程序进程不会被虚拟化的情况:

  • 应用程序是64位的不会被虚拟化,虚拟化只为32位的应用程序启用,遵循开发标准的64位程序不启用虚拟化;
  • 应用程序已经运行在管理员权限下;
  • 要执行的操作来自于一个内核模式的调用者;
  • 要执行的操作来自于一个模拟身份的调用者,比如网络共享访问;
  • 进程的可执行映像文件带有一个与UAC兼容的清单文件(manifest,其中指定了requestedExecutionLevel设置);
  • 服务程序永远不会被虚拟化。

文件虚拟化:

  • 虚拟化的路径包括: %ProgramFiles%、 %ProgramData%以及%SystemRoot%,不包括某些特定的子目录。此外,不包括.exe、 .bat、 .scr、 .vbs等可执行文件。
  • 重定向的路径为“%LocalAppData%\VirtualStore

注册表虚拟化:

  • 虚拟化的路径主要在“HKEY_LOCAL_MACHINE\Software”分支下面,但有很多例外,比如HKLM\Software\Microsoft\Windows、HKLM\Software\Microsoft\Windows NT、 HKLM\Software\Classes等。
  • 重定向的路径为HKEY_CURRENT_USER\Software\Classes\VirtualStore

应用程序控制策略

AppLocker是Windows 7系统和Windows Server 2008 R2中新增的一项安全功能,用以代替以前的“软件限制策略”( Software RestrictionPolicies)。

管理员可以非常方便地进行配置,以实现用户可在计算机上可运行哪些程序、安装哪些文件、运行哪些脚本,可以控制以下这些类型的应用程序文件:可执行程序(.exe、 .com)、动态链接库(.dll、 .ocx)、微软软件安装程序(.msi、 .msp)、Windows Powershell脚本程序(.ps1)、批处理(.bat、 .cmd)、Visual Basic脚本(.vbs)、JavaScript(.js)

Windows系统安全审核

安全审计

对象管理器(Object Manager)可能会生成一些审计事件,并以此作为一次访问检查的结果; 此外,有些可供用户应用程序使用的Windows函数也可以直接生成审计事件。

内核模式的代码总是允许生成审计事件。

有两个特权与审计有关:

  • 一个进程必须有SeSecurityPrivilege特权才能管理安全事件日志(Event Log),以及查找或设置一个对象的SACL
  • 一个进程要调用审计系统服务,必须有SeAuditPrivilege特权才能成功地生成一条审计纪录。
image-20250611003927313

内核态中的安全参考监视器(SRM) 产生安全事件,然后根据安全审核策略(Audit Policy) 决定是否发送给审核子系统; 审核子系统格式化成事件记录后,传递给事件日志服务(Event Logger) ,通过该服务存储到安全事件日志中去。

安全审核策略的设置

审核策略的类型:

  • 审核策略更改:确定是否对更改策略的每个事件进行审核。

  • 审核登录事件:确定是否审核每一个登录或注销计算机的用户实例。

  • 审核账户登录事件:确定是否审核在这台计算机用于验证账户时,用户登录到其它计算机或者从其它计算机注销的每个实例。

    “账户登录事件” 是在账户验证信息所在的位置生成的,而“登录事件”是在登录发生的位置生成的。比如:用户从本地成员主机成功登录到域,则在“域控制器”的安全日志中生成“账户登录事件” ,而在“本地主机”的安全日志中生成“登录事件”。

  • 审核账户管理:确定是否对计算机上的每个账户管理事件进行审核。包括创建、修改或删除用户账户或组;重命名、禁用或启用用户账户; 设置或修改密码等。

  • 审核对象访问:确定是否对用户访问指定了自身 SACL(系统访问控制列表) 的对象(如文件、文件夹、注册表项和打印机等)的事件进行审核。

  • 审核目录服务访问:确定是否对用户访问指定了自身 SACL 的Active Directory(活动目录)对象的事件进行审核。

  • 审核过程追踪:确定是否审核事件的详细跟踪信息,如程序激活、进程退出、句柄复制和间接对象访问等。

  • 审核特权使用:确定是否对用户行使用户权限的每个实例进行审核。

  • 审核系统事件:确定在用户重新启动或关闭其计算机时,或者在影响系统安全或安全日志的事件发生时,是否进行审核。

审核日志的存储文件

image-20250611012744891

Windows木马后门检测

木马后门(RAT, Trojan, Backdoor)即远程控制代码( Remote Administrative Trojan/Tool),是一种隐蔽运行在受害者机器上的恶意代码/软件(Malware) ,可以让攻击者通过网络远程控制受害者的机器,窃取受害者的信息资料和隐私数据。

image-20250611013059567

木马后门植入

  • 向目标用户发送捆绑有木马的可执行文件,诱骗用户打开嵌入在其中的木马程序。
    • 更改木马程序可执行文件的后缀名:exe ->com、 scr、 bat、 cmd、 pif等; dll->cpl;
    • 制作正常的CHM(.chm)电子书,嵌入木马程序;
    • 利用Unicode字符中的“由右往左的阅读顺序”来反转可执行文件名。
  • 向目标用户发送嵌入有木马程序的畸形文件,例如doc、 ppt、 xls、pdf等类型的文件,诱骗用户打开,利用这些文档处理软件的溢出漏洞来释放木马程序运行。
  • 向目标用户发送挂有木马链接的网页,诱骗用户访问, 利用各种浏览器或者Flash、 Java等插件的漏洞来下载木马程序运行。
  • 利用操作系统或应用服务的各类漏洞,对目标计算机实施攻击,获取控制权后运行木马程序。
  • 窃取用户口令,登录计算机后直接运行木马程序。

木马后门开发

管控功能实现技术

木马后门的核心能力:

image-20250611014831937

自启动技术

基于Windows启动目录的自启动

  • Windows NT 5.x:C:\Documents and Settings\All Users\ 「开始」菜单\程序\启动

  • Windows NT 6.x:

    用户启动目录:%USERPROFILE%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup ,当前用户即可写

    系统启动目录:%ProgramData%\Microsoft\Windows\Start Menu\Programs\Startup,管理员组用户才能写

基于注册表的自启动:(HKLM/HKCU表示“或”)

  • HKLM/HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Run\

  • HKLM/HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run\

  • HKLM/HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce\

  • HKLM/HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\

  • 在64位系统中还存在重定向的注册表路径

    HKLM/HKCU\Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Run\

HKLM和HKCU下键值的区别:

自启动的生效时间:

  • HKLM:计算机启动的时候生效
  • HKCU:用户登录的时候生效

写入的权限问题:

  • HKLM:管理员权限才能写入
  • HKCU:当前用户能够写入

基于服务程序的自启动:

服务程序是后台运行的进程,常用来执行特定的任务,不需要和用户进行交互。比如自动更新服务、后台智能传输服务、事件日志服务等。

服务程序的配置数据位于注册表如下键值“HKLM\System\CurrentControlSet\Services”

系统通过服务管理器(SCM, Service Control Manager,对应的进程为services.exe)来管理服务。通过管理工具中的“服务”管理组件可查看管理用户态的系统服务(查看不到内核态的驱动服务)

基于ActiveX控件的自启动:HKLM\SOFTWARE\Microsoft\Active Setup\InstalledComponents{XXXXXXXX-XXXX-XXXX-XXXXXXXXXXXXXXXX}

基于计划任务( Scheduled Tasks)的自启动

用户态的进程隐藏技术

基于DLL插入的进程隐藏

什么是DLL?

  • DLL是Windows系统中的另外一种“可执行文件”,但它不能独立运行,一般需由EXE程序创建的进程加载并调用。
  • DLL只是一组源代码模块,每个模块包含了应用程序将要调用的一组函数。
  • 在应用程序能够调用DLL中的函数之前, DLL文件映像必须被映射到调用进程的地址空间中,然后DLL的函数就可以为进程中运行的所有线程使用。
  • DLL有自身的入口点函数 - DllMain。这是说当DLL被exe加载或卸载后首先进到DllMain函数中。

基于DLL插入的进程隐藏即木马EXE程序利用一些技术手段进入并操作另一个进程的私有内存,将木马DLL插入到该进程的地址空间中,然后自身退出达到无进程的目的。

1.远程线程创建技术CreateRemoteThread:

远线程即不是同一线程的线程。

image-20250611093856268

**2.Windows挂钩技术SetWindowsHookEx **:

Windows的钩子(Hook)函数:Windows系统中消息处理机制的一个平台,应用程序可以在上面进行设置来监视特定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。钩子机制允许应用程序截获处理Window消息或特定事件。也就是说当消息到达后,应用程序在目标窗口处理函数之前处理它,也可以不作处理而继续传递该消息,甚至还可以强制结束消息的传递。

image-20250611094233012

通过安装Windows钩子插入DLL:如果钩子回调函数由一个DLL提供,而被Hook的进程并没有加载这个DLL,那么系统会自动给这个进程加载这个钩子DLL。因此,我们只要使用SetWindowsHook为目标进程安装一个属于某DLL的钩子函数,就可以强迫该目标进程加载这个DLL。


3.APC注入技术QueueUserAPC

异步程序调用APC:一个进程当执行到SleepEx()或者WaitForSingleObjectEx()时,系统就会产生一个软中断,当线程再次被唤醒时,此线程会首先执行APC队列中的被注册的函数;

APC注入:

  • 使用QueueUserAPC()函数在目标进程的APC队列中注册函数,从而使得目标进程去执行指定的代码,比如“LoadLibrary”函数,并且向目标进程的内存写入DLL路径的参数, 从而完成DLL注入的目的(这有点类似于CreateRemoteThread技术);
  • APC注入因为受目标进程使用API的条件而受限,并且处于等待的线程被注入后会立即返回,也有可能造成线程的运行错误,所以应用起来并不是很通用。
进程内存替换 - Process Hollowing

进程内存替换即将一个可执行文件(恶意代码文件)重写到一个运行进程(受信任的进程)的内存空间。其技术流程如下:

  • 1)以挂起状态创建一个正常的合法进程,该进程的主线程被挂起;
  • 2) 调用(Nt)UnmapViewOfSection来释放ImageBaseAddress(被加载可执行文件的基地址)指向的内存;
  • 3)调用VirtualAllocEx为恶意代码分配新的内存;
  • 4)调用WriteProcessMemory将恶意代码的PE头部和每个段(Section)写入到进程的内存空间;
  • 5)调用SetThreadContext恢复进程环境,让入口点指向恶意代码;
  • 6)调用ResumeThread恢复主线程的执行。
基于Svchost服务的进程隐藏

Windows系统服务分为独立进程和共享进程两种,随着系统内置服务的增加, Windows就把很多系统服务变成共享进程的方式,由svchost.exe统一启动。Svchost本身只是作为服务宿主,并不实现任何的服务功能。需要Svchost启动的服务以**动态链接库(DLL)**形式实现。在安装这些服务时,把服务的可执行程序指向svchost,启动这些服务时由svchost加载相应服务的DLL文件。

image-20250611095457193

  • Windows把共享的服务分为几组,同组的服务共享一个svchost进程,不同组的服务则使用多个svchost进程;
  • 组的区别是由服务的可执行程序后边的参数决定的,如svchost-k netsvcs, svchost – k RpcSs;这里的netsvcs和RpcSs就是不同的组名称。
  • svchost的所有组和组内的所有服务都在注册表的如下位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Svchost。

如何安装通过svchost启动的服务?

需要在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Svchost下有该服务名,这可以通过如下方式来实现:

  • 添加一个新的服务组,在组里添加服务名。
  • 在现有组里添加服务名。
  • 直接使用现有服务组里的一个服务名,但本机没有安装的服务。
  • 修改现有服务组里的现有服务,把它的ServiceDll指向Trojan Dll。

数据穿透躲避技术

反弹端口技术
  • 控制端作为服务器在运行后开启监听端口,木马主动向控制端发起通信请求,建立起通信信道;
  • 木马通过固定的域名解析,或者第三方服务器上某个约定的文本文件,或者某个微博的最新信息,或者某个Blog的最新日志内容,获取到攻击者的控制主机(服务器端)的网络地址,然后主动向其发起连接;
  • 反弹连接成功之后,可使用安全的协议隧道(如HTTP/HTTPS加密隧道等)进行通讯,实现远程控制的功能。
协议隧道技术

远程控制传输的指令和数据封装在正常的应用协议中,作为数据部分(往往还进行加密)进行传输,用以躲避基于应用过滤的防火墙和IDS。

常见的协议隧道:HTTP/HTTPS、MSN、 Google Talk( XMPP协议)、Google Docs、各类云平台

内核态的隐藏技术(Rootkit)

Rootkit现在指的是一种特殊的恶意软件或代码,用来在系统中隐藏自身及指定的文件、进程、模块、网络连接、注册表、服务等。其宗旨是一切为了隐藏。 Windows Rootkit往往需要加载恶意的驱动程序,进入到内核态( ring0),从而篡改系统内核来达到隐藏的目的。

MEP技术

MEP,执行路径修改,主旨就是Hook(挂钩、挂接),即拦截系统函数或相关处理例程先转向我们自己的函数处理,这样就可以实现过滤参数或者修改目标函数处理结果的目的,实现进程、文件、注册表、端口之类的隐藏。

Hook技术分类:(下面主要介绍SSDT Hook和Inline Hook

  • SSDT Hook,系统服务描述符表挂钩
  • Inline Hook,内联挂钩
  • IAT (Import Address Table) Hook,导入表挂钩
  • IDT (Interrupt Descriptor Table) Hook,中断描述符表挂钩
  • Filter Driver,过滤驱动
  • IRP Function Hook, IRP函数挂钩

SSDT - System Services Descriptor Table

系统服务描述符表:把Ring3的应用API函数和Ring0的内核API函数联系起来。

SSDT Hook作用是这样子的:

image-20250611100758304

KeServiceDescriptorTable是Windows内核导出的SSDT表,该表拥有一个指针,指向SSDT中包含由ntoskrnl.exe实现核心系统服务的相应部分。

image-20250611100845712

禁用Windows内存保护机制的方法:

  • 更改注册表,但需要重启

    HKLM\SYSTEM\CurrentControlset\Control\Session Manger\Memory Management\EnforceWriteProtection = 0

    HKLM\SYSTEM\CurrentControlset\Control\Session Manger\Memory Management\DisablePagingExecutive = 1

  • 修改控制寄存器CR0,将wp位设置为0

    image-20250611101023145
  • 利用内存描述符表(MDL, Memory Descriptor List)来描述一块可写内存。

    image-20250611101102105

SSDT Hook技术步骤:

  • 突破SSDT的内存保护(如MDL方法)。
  • 实现自己的NewZwQuerySystemInformation函数,过滤掉包含特定字符串的进程名。
  • 交换ZwQuerySystemInformation与我们自己的New*函数

Inline Hook(内联挂钩)技术又被称为Detour技术,运行时补丁技术。

Detour首先查找目标函数在内存空间中的地址, 然后修改前几( 5或7)个字节, 把原有的指令代码改为跳转到替换函数的jmp、 call等语句;Detour技术只须修改单个函数就能够影响系统程序对该函数的调用,而无论程序是通过何种表索引到目标函数的。

image-20250611101504536
DKOM技术

Windows系统采用私有的数据结构在内存中存储对象信息,包括进程、服务、端口等内核对象;直接内核对象操纵DKOM技术通过直接修改内核对象的数据结构来影响上面各层函数的返回结果,从而实现隐藏特定对象的功能;其操作流程如下:

  • 进程的EPROCESS结构包含一个LIST_ENTRY的双向链表结构,该结构具有两个指针成员: FLINK和BLINK,分别指向该进程的前方和后方进程。
  • 通过当前进程来遍历此双向链表,就可以获得Windows系统的所有活动进程列表。
  • 从遍历得到的系统进程列表中匹配找到所需隐藏的进程节点,就可以将其从链表中断开,从而实现将该进程隐藏的目的。

磁盘启动级的隐藏技术(Bootkit)

Bootkit 最早于2005年由eEye Digital公司在其“BootRoot” 项目中提及,该项目通过感染主引导记录(Master Boot Record,MBR)的方式,实现绕过内核检查和启动隐藏。一般认为,在开机时比Windows内核更早加载,实现内核劫持和篡改的技术,都可以称之为Bootkit。

基于修改MBR的Bootkit技术

MBR(Master Boot Record, 主引导记录)存在于磁盘最开始的一个扇区,共512字节,包括446字节的引导代码, 64字节的4个分区表和2字节的结束标志位。可通过直接磁盘操作相应的API函数直接修改 MBR 的引导代码部分,还可直接给磁盘发送SCSI指令来对磁盘进行读写

修改MBR引导代码,在实模式下挂钩磁盘读取中断( INT 13h)或者内存读取中断(INT 15h)函数;然后在中断处理函数中对读到的内容加以过滤,匹配想要加载的指定文件或代码,修改返回的内容,使其跳转到病毒体的保护模式代码,这样便使病毒从实模式的执行权限转向到了保护模式的执行权限。

病毒获取到执行权限之后就可以修改磁盘上的重要系统文件,比如beep.sys等驱动文件, 从而实现隐蔽加载的功能;病毒此时还可以修改系统内核文件(ntoskrnl.exe),去除PatchGuard、 CodeSigning等重要的保护功能。

image-20250611102154779
基于修改VBR的Bootkit技术

VBR(Volume Boot Record,卷引导记录)存在于激活分区(引导分区表项的四个主分区里只有一个是激活的)的第一个扇区之中;病毒感染的对象不是MBR引导代码,而是VBR将要读入的BootMgr Loader的代码

木马后门免杀

  • 对抗传统静态代码检测
    • 加壳,添加花指令,输入表免杀, …
    • 使用不常见的编程语言编写: Go、 Rust、 D、 Nim等
  • 对抗启发式代码检测:动态函数调用
  • 对抗云查杀:动态增大自身体积,更改云查杀服务器域名解析地址,断网,利用散列碰撞绕过云端“白名单”
  • 攻击主防杀毒软件:更改系统时间,窗口消息攻击,主动发送IRP操纵主防驱动
  • 利用证书信任:盗取合法证书,利用散列碰撞伪造证书,利用合法程序的DLL劫持缺陷(DLL Hijack、所谓的“白加黑” )
  • 白名单技术(Living Off the Land、 平地起飞/离地攻击):通过系统中有合法签名的程序来加载恶意代码( DLL文件、脚本代码、 Shellcode等)例如Powershell、 InstallUtil、 IEExec、 Rundll32、 Regsvr32、 Msbuild、 …
  • BYOVD(Bring Your Own Vulnerable Driver):通过向系统中安装植入一个有缺陷的合法驱动程序,然后利用漏洞获得系统的内核权限,进而攻破主动防御/EDR软件。

木马后门检测

基于自启动信息的检测

使用Autoruns工具可以查看系统中所有的自启动项信息,包括注册表启动、服务启动、浏览器组件启动、组策略脚本启动、计划任务启动等许多信息。

image-20250611102402899

基于进程信息的检测

使用ProcessExplorer 工具能够显示进程的基本信息,显示进程加载的DLL模块(名称、描述、公司、版本),显示进程打开的句柄(Handle)信息(类型、名称),显示进程(主要是svchost )包含的服务信息,显示进程的网络连接信息。

使用TcpView工具可以实时动态显示进程的网络连接情况。

基于数据传输的检测

使用WireShark工具可以详细显示包的详细协议信息 ,打开/保存捕捉的包,导入导出其他捕捉程序支持的包数据格式,通过多种方式过滤包,以多种方式查找包,创建多种统计分析等。

Rootkit&Bootkit的检测

检测系统中是否有隐藏的文件、进程、注册表项、通信端口、系统服务、内核模块等,也可用于去除系统中的底层钩子, 保证普通应用层检测软件的结果正确性。

常用工具有:XueTr(XT)、PowerTool(PT)、RootkitUnhooker(RKU)、Kaspersky TDSSKiller、其他(不再更新)(Icesword(冰刃) 、Wsyscheck、DarkSpy、RootkitRevealer等)

木马后门分析

木马后门的动态分析

动态分析的基础技术有:

  • 基于虚拟机执行/沙箱(Sandbox)的动态分析
  • 进程动态监测
  • 网络数据监测:模拟网络(伪造DNS应答,伪造控制端监听)、截获数据包分析

动态分析的高级技术有:

使用OllyDbg技术进行用户模式调试

木马后门的静态分析

静态分析的基础技术有:

  • 反病毒引擎扫描:VirusScan、 VirusTotal、 …
  • 文件格式识别:PEid、 FileAnalyzer、 …
  • 文件加壳识别及脱壳:VMUnpacker、 UPX、 UnPEPack、 ASPack unpacker、 …
  • 明文字符串查找:BinText、 Strings
  • 链接库及导入/导出函数分析:Depends、 IDA Pro、 …

静态分析的高级技术有:

IDA Pro静态分析启动

Windows安全防护技术

文件系统安全

NTFS文件系统简介

NTFS文件系统的优势:

  • NTFS支持更大的文件以及更大的分区
  • NTFS支持多数据流属性。
  • NTFS支持Unicode字符的文件名称。
  • NTFS支持访问权限设置。
  • NTFS支持EFS(加密文件系统)。
  • NTFS支持文件压缩功能。
  • NTFS具备磁盘配额功能。
  • NTFS支持动态盘。
  • NTFS具备恢复日志功能。
image-20250611103446015

文件访问控制

NTFS文件访问权限

文件夹的标准权限:

image-20250611103615018

文件的标准权限:

image-20250611103640712

多重权限关系:

  • 权限是累加的:用户对一个资源的最终权限,是为该用户指定的全部权限和为该用户所属组指定的全部权限之和。

    image-20250611103813260
  • 拒绝权限优先于其他权限

    image-20250611103842481
  • 设置给文件的权限优先于设置给文件夹的权限。文件权限优先于文件夹权限,用户只要有访问一个文件的权限,即使没有访问该文件所在文件夹的权限,也可以访问该文件。

    image-20250611103933126

获取所有权:

  • 当前的拥有者或者具有“完全控制”权限的任何用户,可以将“完全控制”这一标准权限或者“获得所有权”这一特殊访问权限授予另一个用户账户或者组。
  • Administrators组的成员可以取得某个文件或者文件夹的所有权,而不管该文件或者文件夹的权限如何。
  • 为了成为某个文件或者文件夹的拥有者,具有“获得所有权”权限的某个用户或者组的成员,必须明确地取得该文件或者该文件夹的所有权

假设曾对某文件夹设置了权限:只允许UserA用户访问,包括管理员在内的其他用户都禁止访问。后来我们无意中删除了UserA帐户,则该文件夹无法再被访问。这种情况下的正确的做法:

  1. 重新指派所有者。(替换子容器和对象的所有者)
  2. 使用所有者帐户登录,重新设置文件夹的访问权限。
共享文件访问权限

共享文件夹权限比NTFS权限简单,优先级比NTFS权限低;和NTFS权限可以进行组合,结果取决于哪个权限更严格。

共享文件夹权限的特点:

  • 共享文件夹权限只适用于文件夹、而不适用于单独的文件,也不能对该文件夹中的子文件夹和文件设置共享权限。
  • 共享文件夹权限并不对直接登录到计算机上的用户起作用,只适用于通过网络连接该文件夹的用户
  • FAT32文件系统上,共享文件夹权限是保证网络资源被安全访问的唯一方法
  • 默认的共享文件夹权限是指派给Everyone组的读取权限
image-20250611104300837

文件加密

EFS文件加密系统
  • EFS通过加密保护数据的安全:默认情况下,将文件或文件夹加密后,只有进行加密的人才可以访问,其他人就算能够在物理上接触到电脑,只要没有使用加密者的Windows帐户登录,哪怕使用了其他管理员帐户,一样无法访问被加密的文件。
  • EFS最主要的优势:与操作系统结合紧密,对用户透明。
  • EFS采用了非对称加密算法的公私钥体系和对称加密算法的混合加密体制:结合了对称加密算法的加密速度快,以及非对称加密算法的密钥管理方便这两方面的优势。

具体加密过程如下:

  • 文件被复制到临时文件。若复制过程中发生错误,则利用此文件进行恢复。
  • 文件被一个随机产生的Key加密,这个Key叫作文件加密密钥(FEK),这个文件使用DESX或者3DES加密算法进行加密。
  • 数据加密区域(DDF, Data decryption field)产生,这个区域包含了使用RSA算法加密的FEK和用户的公钥。
  • 数据恢复区域(DRF, Data recovery field)产生,这个区域的目的是为了在用户解密文件的中可能解密文件不可用(丢失Key、离开公司等)。这些用户叫做恢复代理,恢复代理在加密数据恢复策略( EDRP)中定义,它是一个域的安全策略。如果一个域的EDRP没有设置,本地EDRP被使用。 DRF包含使用RSA算法加密的FEK和恢复代理的公钥。如果在EDRP列表中有多个恢复代理, FEK须用每个恢复代理的公钥进行加密,也就是会为每个恢复代理创建一个DRF。
  • 包含加密数据、 DDF及所有DRF的加密文件被写入磁盘,文件大小一般保持不变。
  • 在第(1)步中创建的临时文件被删除。

所有文件在使用EFS加密的同时,也使用恢复代理的公钥对文件进行加密(其实是对文件加密密钥的加密)。默认恢复代理:

  • 单机和工作组环境中的Windows XP和Vista/7/8:没有设置。
  • 域环境中的Windows XP和Vista/7/8:域管理员

使用注意事项:

  • 将EFS加密和NTFS权限配合使用。
  • 注意加密证书的创建时间:使用镜像备份软件还原系统时,会导致加密证书的丢失,从而无法打开加密文件。
Bitlocker磁盘加密

是Windows Vista开始引入的一项数据保护新功能,可以解决计算机设备的物理丢失导致的数据失窃或恶意攻击泄漏。Bitlocker通过将Windows的安装分区进行整卷加密,防止被攻击者通过启动其他操作系统来获取文件的“脱机攻击”。

Bitlocker的工作模式:

  • TPM(Trusted Platform Module)模式要求计算机必须带有TPM芯片,这种芯片要通过硬件提供,一般只出现在安全性要求较高的商用计算机或工作站上。
  • USB模式:要求计算机上有USB接口且BIOS支持在开机的时候访问USB设备。用于解密系统盘的密钥文件保存在U盘上,每次重启系统的时候必须在计算机上连接U盘。

安全策略配置

本地安全策略

账户策略

账户策略仅涉及和用户账户的凭据相关的设置。通过设置账户策略、可以让所有本地账户更加安全,同时要破解账户密码所需的时间更长,所需技术更高。包括密码策略和账户锁定策略

账户密码的复杂性要求:

  • 密码至少6个字符。
  • 密码至少拥有3种字符集中的字符(共有大写字符、小写字符、数字以及非字母和数字的字符等四类字符集)。
  • 密码不能有3个以上的字符来源于用户名称分隔项。这些用户名称分隔项是将用户的账户名称使用空格、下划线、Tab等符号分隔成的多个项,并丢弃小于3个字符的项。
image-20250611110819430

账户锁定策略:

image-20250611110854632
本地策略

本地策略中包含的全部是和账户无关的安全设置。通过设置本地策略,可以让Windows实现更严格的安全性,或者实现其他和安全有关的功能。包括审核策略、用户权限分配、安全选项。

审核策略:

image-20250611111037995

**用户权限分配:**确定哪些用户或组具有何种权限和特权。

image-20250611111113929

**安全选项:**启用或禁用计算机的安全设置。

一些重要的安全选项:

  • 交互式登录: 不显示上次的用户名
  • 交互式登录: 用户试图登录时消息标题
  • 交互式登录: 用户试图登录时消息文字
  • 交互式登录: 在密码到期前提示用户更改密码
  • 交互式登录: 不需要按Ctrl+Alt+Del
  • 账户: 管理员账户状态
  • 账户: 来宾账户状态
  • 账户: 使用空白密码的本地账户只允许进行控制台登录
  • 账户: 重命名来宾账户
  • 账户: 重命名系统管理员账户
  • 网络安全: 不要在下次更改密码时存储LAN Manager的Hash值(网络安全: 在下一次更改密码时不存储LAN管理器哈希值)
    • Windows XP/Server 2003:已禁用
    • Windows Vista/7/Server 2008:已启用
  • 网络安全: LAN Manager身份验证级别(网络安全: LAN管理器身份验证级别)
    • Windows Server 2003之前:默认同时“发送LM和NTLM响应”。
    • Windows Server 2003:默认“仅发送NTLM响应”。
    • Windows Vista/7/Server 2008:默认“仅发送NTLM v2响应

组策略

通过组策略(Group Policy)可以设置整个组织的集中化策略或分散式策略。

组策略对象( Group Policy Object, GPO):组策略对象实际上就是组策略设置的集合。

组策略对象包含:

  • 针对计算机的组策略设置
    • 应用在操作系统初始化和周期性更新循环过程中。
    • 指定操作系统行为、桌面行为、安全性设置、计算机启动和关机指令、计算机赋予的应用程序选项以及应用程序设置。
  • 针对用户的组策略设置
    • 应用在用户登录计算机和周期性更新循环的过程中。
    • 指定操作系统行为、桌面行为、安全性设置、赋予和公布的应用程序选项、应用程序设置、文件夹的重定向选项以及用户登录和注销指令。

组策略对象与活动目录的联合使用实现了策略的集中与分散管理,适应从小到大的各种网络规模。组策略对象能够链接到站点、域和组织单元,影响其中的用户和计算机。应用组策略对象的顺序和级别决定了用户和计算机实际所采用的组策略设置。

Linux核心安全机制

Linux的身份认证机制

用户类型

Linux的用户类型:

  • root用户:权限最高的根用户, UID 0
  • 系统用户:非交互式登录, UID 1-999
  • 普通用户:可交互式登录, UID 1000-65533, 65536-4294967294

用户身份切换:

  • su:切换用户身份,默认切换至root
  • sudo:切换用户身份执行,默认切换至root用户身份执行

密码保存

  • 用户帐号文件 — /etc/passwd:任何用户可读, root用户可写

    image-20250611111850630
  • 加密的用户帐号文件 — /etc/shadow:root用户可读写, root同组用户可读

    image-20250611111925265

密码散列生成

$1$salt$hash,第一个$后的1是算法ID,第二个$后到第三个$前是盐值。

image-20250611112046175

密码安全策略

密码安全策略的配置文件:/etc/login.defs

image-20250611112135059

可插入认证模块(PAM)

Linux的PAM是一套共享库(libpam.so*), 使得管理员可以随意选择应用程序的认证方式,而不用重新编译应用程序。支持PAM的应用程序被称之为PAM-Aware的应用程序。

常见的capabilities:

image-20250611114553261
  • 进程的capabilities集合:每一个进/线程,具有5个capabilities集合。每一集合使用64位掩码来表示,包含零个或多个capabilities。
    • Permitted(CapPrm):被允许的
    • Effective(CapEff):有效的,系统真正检查的集合
    • Inheritable(CapInh):可继承的
    • Bounding( CapBnd):边界的(可被允许和继承的天花板)
    • Ambient(CapAmb):环境的(托底的,一般为0)
  • 文件的capabilities集合:文件的capabilities被保存在文件的扩展属性中。(如果想修改这些属性,需要具有CAP_SETFCAP的capability),文件的capabilities具有3个capabilities集合:
    • Permitted:被允许的
    • Effective:只是一个bit
    • Inheritable:可继承的

进程 Capabilities 的计算公式:

当通过 execve() 执行一个文件时,新进程的 Capabilities 集合(P’)会根据原进程的 Capabilities(P)、文件的 Capabilities(F)以及系统的 Bounding 集合(cap_bset)进行计算。

1.Ambient 集合

1
P'(ambient) = (file is privileged) ? 0 : P(ambient)
  • 如果文件是“特权文件”(如 setuid 或 setgid 文件),新进程的 Ambient 集合被清空(设为 0)。
  • 否则,新进程继承原进程的 Ambient 集合。

2.Permitted 集合

1
P'(permitted) = (P(inheritable) & F(inheritable)) | (F(permitted) & cap_bset) | P'(ambient)
  • 新进程的 Permitted 集合由三部分组成:
    • 原进程的 Inheritable 集合与文件的 Inheritable 集合的交集
    • 文件的 Permitted 集合与系统 Bounding 集合的交集
    • 新进程的 Ambient 集合(由第 1 步公式确定)。
  • 这一公式确保新进程的权限不会超出文件的权限、原进程的可继承权限以及系统的 Bounding 限制。

3.Effective 集合

1
P'(effective) = F(effective) ? P'(permitted) : P'(ambient)
  • 如果文件的 Effective 标志位(F(effective))为真,新进程的 Effective 集合等于其 Permitted 集合。
  • 否则,Effective 集合仅包含 Ambient 集合。

Inheritable 集合

1
P'(inheritable) = P(inheritable)
  • 新进程的 Inheritable 集合直接继承原进程的 Inheritable 集合,不受文件 Capabilities 影响。

Linux的访问权限控制

一般权限控制

文件类型与权限位:

image-20250611112330348

权限控制命令:

  • 更改文件的权限位: chmod

  • 设置文件权限屏蔽位: umask

    表示在新建文件或新建目录时进行默认权限设置时加以屏蔽的部分,对umask的值逐位取反即可得到默认的文件权限设置。

    umask 022:则新建文件的默认权限设置为755, 即 rwxr-xr-x

  • 更改文件的所有者及所有组: chown

特殊权限控制

image-20250611112905070
  • 粘滞位(sticky bit)权限: o+t

    一般设置在目录上(比如/tmp),即使用户对该目录有写入权限,也不能删除其他用户的文件,只有文件所有者和root用户才有权删除

  • SUID(setuid)权限: u+s

    SUID仅作用在二进制可执行文件上,该文件运行时, 它的有效用户ID为文件所有者的ID, 而不是启动它的用户ID。

  • SGID(setgid)权限: g+s

    与SUID类似, SGID可执行文件运行时, 它的有效组ID是文件所有组的ID,而不是启动它的用户组ID。

附加属性控制

文件附加/隐藏属性:

属性标志 含义
i immutable,文件不能修改、删除、重命名
a append only,只能在文件后附加数据,不能删除
c compress,系统透明的压缩和解压缩文件
s secure,安全删除文件,磁盘空间不可恢复
u undelete,文件删除时,保留所有数据块,方便日后恢复

文件附加/隐藏属性的控制 :

  • 列出目录:lsattr
  • 更改:chattr

Capabilities权限控制

早期版本的Linux进程只区分root和非root进程,粒度太粗;Linux内核2.2之后引入了capabilities机制,来对权限进行更细粒度的划分。如果进程不是特权进程,且也没有root的有效id,系统就会去检查进程的capabilities,来确认是否有执行相应操作的权限

Linux的安全审计机制

用户登录行为审计

用户登录相关的日志文件

  • utmp文件: /var/run/utmp:记录当前登录的每个用户
  • wtmp文件: /var/log/wtmp:utmp记录的历史数据
  • btmp文件: /var/log/btmp:记录失败的用户登录尝试
  • lastlog文件: /var/log/lastlog:记录每个用户的最后一次登录
  • history文件: ~/.bash_history, ~/.zsh_history, …:记录当前用户的历史命令记录

审计相关命令

  • w/who:查看当前登录用户信息,读取解析utmp文件
  • last:查看当前登录和过去登录的用户信息,读取解析wtmp文件
  • lastb:查看用户登录失败记录,读取解析btmp文件
  • lastlog:查看所有用户的最后一次登录时间,读取解析lastlog文件

Syslog日志机制

Syslog代表系统日志记录协议(System Logging Protocol), 是用于将系统日志或事件消息发送到特定日志服务器的标准协议。它主要用于从一个中心位置的几台不同计算机收集各种设备日志,以进行监视和查看。

系统日志消息由三部分组成: PRI(优先级) 、 HEADER和MSG。

PRI(优先级)根据以下两个数值计算而来:

  • 1) Facility(设施)。表示消息的类型或者产生消息的系统来源,取值包括预定义的0-15或者自行定义的16到23。
  • 2) Severity(严重)。表示消息的重要性,取值从0-7。
  • PRI = (Facility * 8) + Severity
image-20250611113916682

Linux系统的Syslog:

  • syslogd:syslog服务接受和处理syslog消息,它创建一个socket监听事件,应用程序可以写入消息。 syslog可以将消息写入本地文件或将消息转发到远程服务器。
  • syslog-ng:增强的syslogd,支持TLS
  • rsyslog:扩展了Syslog协议,也可用于systemd

Linux的其他安全机制

Namespace(命名空间)

Namespace是Linux内核对全局系统资源的一种封装隔离,处于不同namespace的进程拥有独立的全局系统资源;其应用场景:容器(Container)。

其类型有:

  • Mount,文件系统挂载点
  • PID,进程ID– UTS(Unix Timesharing System),主机名和(NIS)域名
  • Network, 网络系统资源
  • IPC(Inter-process communications),进程间通信对象和消息队列
  • Cgroup(Control groups), 控制组群
  • User,用户和用户组

namespace的相关函数调用:

  • unshare:创建和原进程namespace隔离的新进程,也就是创建加入新的namespace
  • clone:创建能和父进程共享namespace的子进程
  • setns:将当前进程加入到已有的namespace中

Cgroups(控制组群)

namespace决定进程可以看到什么资源, cgroup决定进程可以用什么资源;cgroup(control group)是Linux内核提供的一种用于限制、记录,隔离进程组所使用物理资源(CPU、 Memory、 I/O等)的机制;每一种受控的资源都会有一个对应的Cgroups控制器,这些Cgroups控制器通过伪文件系统cgroup来提供相应的服务,实现对不同进程组的资源控制。

Cgroups的应用场景还是在容器中,目前有cgroup v1和v2两个版本:

  • v1:每进程控制模式;目前还是主流(各大公有云);
  • v2:系统整体控制模式

Seccomp(安全计算模式)

Seccomp是Linux内核中一种**限制进程使用系统调用(Syscall)**的安全机制,最早是2.6.12版本(2005年)引入的,当时引入的目的是为了租借服务器上空闲的CPU资源跑一些非授信程序。

Seccomp有两种模式:

  • STRICT模式:仅允许进程执行read、 write、 _exit以及sigreturn共4个系统调用;
  • FILTER模式:基于上级进程所配置的过滤规则对进程执行的系统调用进行检查。

AppArmor

AppArmor是一种内核增强,旨在通过每个程序的配置文件限制程序可用的资源, 它将访问控制属性直接绑定到程序而不是用户来有效实现强制访问控制(MAC) 。配置文件规定了程序可以访问的资源,如网络连接、原始套接字访问和文件权限,通常在引导期间加载到内核中。

AppArmor通过内核LSM(Linux Security Modules)接口实现,有两种运行模式:

  • Enforce模式:阻止对于限制资源的访问;
  • Complain模式:仅对指定事件进行监控和记录。