1. 项目概述:当“CE提权”遇上“检测”这道墙
在Windows安全攻防的实战演练或渗透测试中,通过配置错误或漏洞获取更高权限(提权)是至关重要的一环。而“CE提权”这个说法,在圈内通常不是一个标准术语,它更像是一个混合体:一部分可能指代利用像PsExec这类源自Sysinternals套件的强大工具进行远程命令执行和权限提升;另一部分,则可能关联到使用“Cheat Engine”(简称CE)这类内存修改工具,通过注入、劫持进程内存等方式,在特定场景(如某些游戏或应用)中绕过本地权限限制,执行非授权操作。无论具体指代哪一种,其核心目标都是突破系统预设的权限边界。
但如今,单纯地执行提权操作已经远远不够。无论是企业部署的终端检测与响应(EDR)系统、新一代防病毒软件(AV),还是操作系统自身的安全机制(如Windows Defender、受控文件夹访问、攻击面减少规则等),都构建了层层检测防线。你的提权动作,无论是通过PsExec的网络连接、服务创建,还是通过内存注入修改关键数据,都可能触发警报,导致行动暴露甚至被阻断。因此,“过检测”成为了比“能提权”更高级、更迫切的需求。它要求我们不仅要知道怎么拿到SYSTEM或Administrator权限,更要研究如何让这个过程在安全软件的“眼皮底下”悄无声息地完成。
这就像一场猫鼠游戏。防守方(检测系统)在不断进化,从简单的特征码匹配,发展到行为分析、异常检测、机器学习模型。作为攻击方或安全测试人员,我们的技术也必须随之迭代。本文将深入探讨在Windows环境下,围绕“提权”这一核心动作,如何识别并规避常见的检测点。我们会结合PsExec的经典用例,并延伸讨论内存操作、进程注入等相关技术的隐蔽化思路,目标是提供一套可落地的、强调“静默”和“融合”的实战方法论,而不仅仅是罗列攻击命令。
2. 理解检测的维度:安全软件在看什么?
在尝试绕过检测之前,我们必须先站在防守方的角度,理解安全产品究竟在监控哪些行为和特征。盲目地使用工具就像在雷区乱跑,迟早会踩响警报。现代终端安全检测通常涵盖多个维度,我们可以将其分为静态检测和动态检测两大类。
2.1 静态检测:你的“装备”是否上了通缉令
静态检测关注的是文件本身,而不关心它是否运行、如何运行。这主要包括:
- 文件哈希值匹配:这是最基础的检测方式。安全厂商维护着庞大的恶意软件哈希值(如MD5、SHA-1、SHA-256)数据库。如果你使用的
PsExec.exe是直接从Sysinternals官网下载的原始版本,它的哈希值大概率是干净的。但如果你使用的是一些被黑客修改过的、捆绑了后门的版本,或者是一些小众的、已被标记的提权工具,那么仅仅将其拷贝到目标机器上,就可能被实时扫描检出。 - 特征码扫描:安全软件会在文件二进制代码中搜索特定的字节序列(特征码),这些序列被认为是恶意软件的独特标识。例如,一个专门用于提权的Shellcode载荷、某个已知漏洞利用的汇编指令片段,都可能被提取为特征码。一些公开的漏洞利用代码(Exp)或“武器化”的提权脚本,很容易被收录特征。
- 数字签名与信誉:Windows系统本身和许多安全软件会检查文件的数字签名。一个由微软(Microsoft)或知名公司签名的
PsExec,其可信度远高于一个无签名的、名称也是PsExec.exe的可执行文件。无签名或签名无效的文件会被标记为“信誉未知”或“低信誉”,从而引发更严格的行为监控。
应对思路:对于静态检测,核心思路是“变”。但这不仅仅是改个文件名那么简单。对于工具本身,如果条件允许,使用官方正版、有合法签名的工具是最佳选择。对于必须使用的无签名或自定义工具,则需要进行代码混淆、加壳(但要注意某些壳本身也被标记)、或从根本上重写关键功能代码以改变其二进制特征。更高级的做法是“就地取材”,利用系统已存在的、可信的合法程序(如powershell.exe,certutil.exe,bitsadmin.exe)来承载你的恶意操作,这被称为“Living-off-the-Land”(LotL)。
2.2 动态检测:你的“行为”是否露出了马脚
动态检测,也称为行为检测,是当前更主流的、也更难规避的检测方式。安全软件会监控进程的运行时行为,建立基线,并对异常行为进行告警。与提权相关的关键检测点包括:
进程创建行为:
- 父进程-子进程关系异常:一个普通的
word.exe进程突然创建了cmd.exe或powershell.exe,这是高度可疑的。同样,svchost.exe通常不会直接生成whoami.exe。检测系统会学习正常环境下的进程派生树。 - 进程路径异常:从临时目录(
C:\Users\Public、C:\Windows\Temp)、回收站、或网络共享位置启动的可执行文件,会被高度关注。 - 进程参数可疑:命令行参数中包含了明显的恶意指令,如
-nop -w hidden -c(PowerShell 隐藏窗口执行)、/c net user ...等。
- 父进程-子进程关系异常:一个普通的
权限与令牌操作:
- 令牌窃取与复制:这是提权的核心。操作如
OpenProcess打开高权限进程、OpenProcessToken获取令牌、DuplicateTokenEx复制令牌、CreateProcessWithTokenW或CreateProcessAsUser创建新进程,这一系列API调用是EDR的重点监控对象。特别是从lsass.exe(存储凭据)或winlogon.exe等关键系统进程获取令牌。 - 特权启用:调用
AdjustTokenPrivileges来启用诸如SeDebugPrivilege(调试权限)、SeImpersonatePrivilege(模拟权限)等,是提权前的常见准备动作。
- 令牌窃取与复制:这是提权的核心。操作如
服务与计划任务操作:
- 服务创建/修改:
PsExec的核心原理就是在远程或本地系统上创建并启动一个服务(默认名称为PSEXESVC),通过服务执行命令。因此,CreateService、StartService这些API调用,以及短时间内创建又删除的服务,都是强信号。 - 计划任务创建:通过
schtasks创建计划任务来执行后续载荷,也是常见手法。
- 服务创建/修改:
网络与横向移动:
- 异常的网络连接:
PsExec需要访问目标机器的445端口(SMB)和135端口(RPC)。从一台非管理员的办公电脑向多台服务器发起大量的SMB连接,这种行为本身就值得怀疑。 - WMI远程调用:使用
wmic或Invoke-WmiMethod进行远程进程创建,是PsExec的替代方案之一,同样会被监控。
- 异常的网络连接:
内存操作:
- 进程注入:这是“CE”类工具(如Cheat Engine)或Shellcode加载器的常见行为。包括:使用
VirtualAllocEx在目标进程分配内存、WriteProcessMemory写入Shellcode、CreateRemoteThread或QueueUserAPC远程执行代码。这些API调用序列是EDR的“头号通缉犯”。 - 对关键进程的内存读写:尝试读取
lsass.exe的内存以提取哈希(Mimikatz 行为),或向系统进程写入代码,都会触发最高级别的警报。
- 进程注入:这是“CE”类工具(如Cheat Engine)或Shellcode加载器的常见行为。包括:使用
理解了这些检测点,我们才能有针对性地设计我们的“过检测”策略。核心原则是:尽可能模仿正常、合法的系统活动,避免触发那些被明确定义为恶意的行为模式。
3. 经典工具PsExec的“隐身”实战
PsExec是系统管理员和渗透测试人员的“瑞士军刀”,正因如此,它的行为模式也被安全产品研究得非常透彻。直接使用默认参数的PsExec,在稍有防护的环境下无异于“裸奔”。下面我们拆解其每一步,并给出隐蔽化方案。
3.1 默认PsExec的执行流程与检测点
当我们执行PsExec.exe \\目标IP -u 用户名 -p 密码 cmd.exe时,背后发生了以下关键步骤,每一步都可能被记录:
- 连接与认证:通过SMB协议连接至目标的ADMIN$共享,并进行身份认证。网络流量可能被IDS/IPS检测。
- 服务端上传:将
PSEXESVC.exe(一个小的服务包装器)上传到目标的ADMIN$\System32目录。文件落地动作会被监控。 - 服务创建:通过SCM(服务控制管理器)远程创建名为
PSEXESVC的服务,指向上传的可执行文件。CreateServiceAPI被调用。 - 服务启动:启动该服务。服务启动后,会连接回发起端的命名管道,接收要执行的命令。
- 命令执行与回显:服务进程创建目标命令进程(如
cmd.exe),并将其输入/输出通过管道重定向回控制端。 - 清理:命令执行完毕后,服务停止并被删除,上传的
PSEXESVC.exe文件也被删除。这种“速建速删”的服务模式非常可疑。
3.2 阶段一:工具本身的伪装与免杀
这是绕过静态检测的第一步。
- 使用合法签名版本:始终从微软官方Sysinternals套件中获取
PsExec。它有微软的有效数字签名,信誉极高。 - 重命名与哈希规避:将
PsExec.exe改名为一个看似无害的名字,例如help.exe,svchosthelper.exe,或者模仿系统组件如dllhost.exe。但这只能规避基于名称的简单规则,对哈希和特征码检测无效。 - 自定义编译(高级):最彻底的方法是获取
PsExec的源代码(Sysinternals工具早期部分有泄露),修改其中的服务名、管道名、通信方式等特征,然后用自己的编译器重新编译。这会生成一个哈希值全新的文件,只要你的代码修改没有引入新的可疑字符串或API调用模式,就能有效绕过静态特征库。注意:这需要一定的编程和逆向工程能力。
3.3 阶段二:执行过程的隐蔽化改造
这是绕过动态检测的关键。我们需要在流程上做文章。
修改默认服务名和描述:
PsExec支持-r参数指定服务名。不要使用默认的PSEXESVC。可以改为一个看起来像系统服务或已知合法软件服务的名称,例如TeamViewerService,IntelUpdateManager等。同时,如果自定义编译,可以连服务描述也一并修改。PsExec.exe \\target -u admin -p Passw0rd -r IntelUpdateSvc cmd.exe避免使用ADMIN$共享:
PsExec默认使用ADMIN$共享(映射到C:\Windows)。可以尝试使用其他已有的可写共享,或者如果权限足够,先建立一个隐蔽的共享。但这通常比较困难,因为ADMIN$是管理员默认就有的。延缓清理,持久化伪装:不要立即删除服务和文件。可以让服务保持停止状态,而不是删除它。将
PSEXESVC.exe文件留在系统目录,并将其属性、时间戳修改得与周围系统文件一致(使用timestomp类工具)。这样,安全软件的一次性扫描可能不会将其与刚刚发生的恶意行为关联起来。风险在于留下了持久化的痕迹,容易被后续排查发现。使用备用端口与加密(如果支持):某些修改版的
PsExec或类似工具支持更换通信端口和使用SSL/TLS加密通信流量,这可以绕过基于默认端口和明文协议检测的IDS规则。降权运行与上下文模仿:如果已经有一个立足点,可以考虑先以当前用户权限运行一个合法的、有签名的管理工具(如
msiexec.exe),然后通过进程注入或DLL劫持的方式,将PsExec的功能代码“寄生”到该合法进程中执行。这样,行为监控看到的父进程是合法的,难度大增。
3.4 阶段三:替代方案与“无文件”思路
有时候,最好的隐藏就是不使用会被重点监控的工具。
WMI作为替代:Windows Management Instrumentation (WMI) 是管理系统的重要组件,其活动非常频繁。使用
wmic或 PowerShell 的Invoke-WmiMethod进行远程进程创建,在很多环境中可能比PsExec更低调。# 使用 wmic wmic /node:targetIP /user:admin /password:Passw0rd process call create "cmd.exe /c whoami > C:\output.txt" # 使用 PowerShell $Cred = New-Object System.Management.Automation.PSCredential ("admin", (ConvertTo-SecureString "Passw0rd" -AsPlainText -Force)) Invoke-WmiMethod -Class Win32_Process -Name Create -ArgumentList "cmd.exe /c whoami" -ComputerName targetIP -Credential $Cred注意:WMI活动同样会被高级EDR监控,特别是异常的远程WMI调用。但其“噪音”相对较小,更容易混迹于正常的管理流量中。
计划任务远程执行:通过
schtasks在远程机器上创建计划任务来执行命令,也是一种方法。可以设置任务在创建后立即执行一次,然后自我删除。schtasks /create /s targetIP /u admin /p Passw0rd /tn "SystemUpdate" /tr "cmd.exe /c whoami > C:\log.txt" /sc once /st 00:00 /ru SYSTEM schtasks /run /s targetIP /u admin /p Passw0rd /tn "SystemUpdate" schtasks /delete /s targetIP /u admin /p Passw0rd /tn "SystemUpdate" /f“无文件”与内存执行:这是更高阶的规避技术。不向磁盘上传任何可执行文件。而是将提权所需的Shellcode或PE文件,通过PowerShell、 .NET程序、VBScript等脚本,直接加载到内存中执行。例如,使用PowerShell的
Invoke-ReflectivePEInjection可以将一个PE文件反射加载到内存。结合WMI或计划任务来触发内存执行,可以做到“落地无文件”,极大增加检测难度。这种技术门槛较高,且内存行为本身也可能被EDR的运行时检测捕捉。
4. 内存注入与进程劫持的隐蔽之道
“CE提权”中的“CE”如果指代类似Cheat Engine的内存修改,那么其核心就是进程注入和内存读写。这在提权场景中,常被用于向高权限进程(如以SYSTEM运行的services.exe,spoolsv.exe等)注入代码,从而继承其权限。下面我们探讨如何让这个过程更隐蔽。
4.1 选择“合适”的目标进程
不是所有高权限进程都适合注入。选择目标时需考虑:
- 稳定性:注入系统关键进程可能导致系统不稳定甚至崩溃。通常选择那些非核心但又是SYSTEM权限的进程,例如
svchost.exe的某个实例(承载非关键服务)、dllhost.exe(COM宿主)等。 - 行为基线:选择一个在正常环境下也会产生子进程、进行网络连接或加载模块的进程。例如,向一个从不联网的
svchost实例注入并让其发起网络连接,就很异常。但如果向RuntimeBroker.exe(本身负责应用权限管理,行为多样)注入,可能更隐蔽。 - 现有工具:Metasploit的
migrate命令、Cobalt Strike的inject功能,都内置了进程迁移逻辑,通常会优先选择与当前进程架构相同(x86/x64)、权限足够且“安静”的进程。
4.2 优化注入技术与API调用链
传统的VirtualAllocEx->WriteProcessMemory->CreateRemoteThread三联招是教科书级别的,也是EDR重点监控的黄金指标。
使用替代的注入技术:
- 线程劫持(Thread Hijacking):挂起目标进程的一个现有线程,修改其上下文(如指令指针EIP/RIP)指向你的Shellcode,然后恢复线程。这避免了创建新线程。
- 异步过程调用(APC)注入:使用
QueueUserAPC将Shellcode排队到目标进程的线程APC队列中。当线程进入可警报状态时,Shellcode被执行。这需要目标线程能进入这种状态,常用于svchost等。 - DLL劫持/搜索顺序劫持:利用Windows DLL搜索路径的缺陷,将恶意DLL放在合法程序查找的位置,当高权限进程启动时自动加载。这属于持久化技术,也可用于提权。
- 反射式DLL注入(Reflective DLL Injection):DLL不从磁盘加载,而是直接将DLL的二进制映像映射到内存中,并自行完成重定位、解析导入表等加载器的工作。全程无文件落地,且不调用
LoadLibrary等敏感API。
间接调用与API混淆:直接调用
CreateRemoteThread很显眼。可以尝试:- 通过
RtlCreateUserThread或NtCreateThreadEx等更底层的NT API来创建线程。 - 在Shellcode内部,使用动态解析API地址(通过PEB遍历)的方式,而不是直接引入
kernel32.dll的函数名,以避免字符串特征。 - 将注入代码拆分成多个无害的小片段,分时写入和执行。
- 通过
4.3 规避运行时内存扫描(ETWTI)
Windows提供了强大的事件跟踪机制(ETWT),EDR可以通过它订阅内核事件,深度监控进程内存的分配、写入和执行。一些高级EDR甚至能对进程内存进行实时或定时的YARA规则扫描。
- 内存加密与混淆:仅在执行前一刻将关键的Shellcode解密到内存中,执行后立即擦除。这减少了恶意代码在内存中以明文形式驻留的时间窗口。
- 使用合法的代码签名:如果注入的代码块本身具有有效的微软或其他受信任发行者的签名,内存扫描引擎可能会选择信任而降低检测级别。
- 利用合法的内存区域:尝试将代码注入到具有可执行权限的合法模块(如某个已加载的DLL)的内存空间中,或者利用一些应用程序固有的可读可写可执行(RWX)内存页,这比新分配一块具有PAGE_EXECUTE_READWRITE属性的内存更低调。
5. 系统配置错误利用的“低调”艺术
除了主动注入,利用系统已有的配置错误(Misconfiguration)进行提权,往往能更有效地绕过行为检测,因为你的操作是在利用一个“合法”的缺陷。这与输入中提到的“windows配置错误导致的提权”思路一致。
5.1 服务路径与权限漏洞
如果一个以SYSTEM权限运行的服务,其可执行文件路径未被引号包裹,且路径中包含空格,Windows会按顺序尝试解析路径。例如,服务路径为C:\Program Files\My Service\service.exe,攻击者可以在C:\Program目录下上传一个名为Files.exe的可执行文件,当服务重启时,系统会执行C:\Program Files.exe而不是预期的程序。
过检测要点:
- 文件放置:将你的后门程序(如反向Shell)命名为一个看似合理的名字,如
java.exe,python.exe,并放置在可写目录。避免使用svchost.exe,lsass.exe等关键系统文件名,这太容易触发警报。 - 触发时机:不要立即重启服务,这会引起注意。可以等待系统计划的重启,或者结合其他漏洞(如权限提升后)再修改服务配置并触发。
- 文件属性伪装:修改后门文件的时间戳、版本信息等,使其看起来更像一个合法文件。
5.2 不安全的服务权限
服务的访问控制列表(ACL)配置不当,允许低权限用户修改服务配置或状态。例如,允许普通用户对某个SYSTEM服务拥有SERVICE_CHANGE_CONFIG权限。
过检测要点:
- 使用原生工具:利用系统自带的
sc.exe或PowerShell的Set-Service、Get-Service等cmdlet来查询和修改服务配置。这些工具的行为是正常的系统管理活动。 - 最小化修改:只修改必要的字段,如
binPath。避免同时修改服务名、描述等多个属性。 - 恢复现场:在获得权限后,考虑将服务配置恢复原状,清除痕迹。
5.3 计划任务权限漏洞
与服务类似,计划任务的ACL配置错误也可能导致提权。
过检测要点:
- 模仿合法任务:创建或修改计划任务时,使用与系统其他任务相似的命名(如
\Microsoft\Windows\Maintenance下的任务)、描述和作者信息。 - 设置合理的触发条件:不要设置为“每分钟触发”或“登录时”这种高频率或敏感触发点。可以设置为每天特定时间,或系统事件ID触发,看起来更像一个维护任务。
- 使用
schtasks/XML参数:通过XML文件创建任务可以更精细地控制所有属性,使其看起来更“正规”。
5.4 AlwaysInstallElevated策略
如果组策略中启用了AlwaysInstallElevated,任何用户都可以以SYSTEM权限安装MSI包。这是一个严重的配置错误。
过检测要点:
- 制作“合法”的MSI包:使用如
WiX Toolset或msiexec配合.vbs脚本生成一个功能简单的MSI安装包,其安装操作就是执行你的载荷。给MSI包添加看似合理的产品名称、制造商信息。 - 静默安装:使用
msiexec /i evil.msi /quiet /qn /norestart进行静默安装,不弹出任何界面。 - 安装后清理:安装程序执行完载荷后,应能自动回滚或卸载,移除MSI包本身,减少残留。
利用配置错误的核心优势在于,你的大部分操作(如写文件、修改注册表、创建计划任务)本身是系统允许的(因为权限配置错误),只是目的不正当。因此,关键是将这些操作伪装成正常的系统管理或软件维护活动,融入环境噪音之中。
6. 环境融合与痕迹清理
即使技术再隐蔽,异常的行为模式或残留的痕迹也可能在事后分析中暴露你。因此,操作中和操作后的“环境融合”与“痕迹清理”至关重要。
6.1 操作中的融合
- 节奏控制:避免在短时间内进行大量高权限操作。将提权、信息收集、横向移动等步骤分散在不同时间进行,模拟正常管理员的工作节奏。
- 使用合法账户:尽可能使用窃取到的合法管理员凭据进行操作,而不是一直使用漏洞利用获得的权限。来自合法账户的登录和操作,在日志中看起来更正常。
- 模仿正常流量:如果进行横向移动,网络连接应模仿正常的运维流量。例如,使用RDP(3389)、WinRM(5985/5986)等协议,比使用自定义端口的反向Shell流量更常见。
6.2 操作后的清理
- 日志清除:Windows事件日志(安全日志、系统日志、应用程序日志)是调查的主要依据。需要清除相关事件ID。但这本身是一个高危操作,因为直接删除日志条目或清空日志会产生新的、更可疑的日志(事件ID 1102)。更隐蔽的做法是,在操作前禁用特定渠道的日志记录(如果权限足够),或者使用内存修补技术阻止关键操作被记录。
- 文件痕迹清理:
- 删除上传的工具、生成的输出文件。
- 使用
sdelete或cipher /w进行安全擦除,防止文件恢复。 - 恢复你修改过的文件(如服务二进制文件、计划任务XML)的原始时间戳(使用
SetFileTimeAPI或timestomp工具)。
- 注册表清理:清除运行键、服务注册表项、WMI持久化等留下的注册表项。同样要注意恢复键的最后修改时间。
- 内存痕迹:卸载注入的DLL,结束创建的远程线程,释放分配的内存。对于注入到系统进程的代码,如果无法安全卸载,则让其进入休眠状态或自我终结,避免持续活动。
重要提醒:完全的痕迹清理几乎是不可能的,尤其是面对部署了EDR和完整日志审计的环境。安全团队可以通过网络流量记录、终端行为基线对比等多种方式进行关联分析。因此,红队行动或渗透测试的最高目标不是“绝对隐身”,而是“在达到战术目标的时间内保持隐蔽”,并尽量提高事后调查的成本和难度。
7. 工具、检测与对抗的持续演进
安全是一个动态对抗的过程。本文讨论的技术可能会随着操作系统更新和安全产品升级而失效。
- 关注微软安全更新:微软定期发布安全更新,修补提权漏洞(如最新的“九世”漏洞,可能指某个具体的CVE)。同时,Windows Defender和系统自身的安全机制(如AMSI、WDAC、CFG)也在不断增强。
- 研究EDR绕过技术:关注安全研究社区(如MDSec、Red Team Ops)的最新成果,了解如何绕过特定EDR产品的用户态/内核态钩子(Hooking)、如何禁用ETW提供程序、如何利用未导出的内核函数等高级技术。
- 自定义工具开发:依赖公开工具的风险越来越高。根据目标环境定制开发工具,是高级攻击者的常见做法。这要求具备C/C++、C#、PowerShell等语言的开发能力,以及对Windows内部机制的深入理解。
- 模拟测试与验证:在内部实验室搭建与目标相似的环境(相同的OS版本、安全产品),对你的提权及过检测方法进行充分测试。使用Sysmon、Procmon、Windows事件日志以及商业EDR的试用版来验证你的操作是否会产生警报。
最终,CE提权过检测不是一个固定的技术点,而是一个涵盖工具学、行为分析、操作系统原理和对抗思维的综合性领域。它要求从业者不仅要知道攻击的“矛”如何锋利,更要深入理解防守的“盾”如何运作,并在两者的动态博弈中,找到那条稍纵即逝的路径。真正的隐蔽,源于对“正常”的深刻理解和精准模仿。