SYSTEM上下文下访问与删除用户本地凭据的技术问询
从SYSTEM上下文访问/删除用户凭据的解决方案
核心原因
Windows凭据管理器的Web/Windows凭据默认存储在用户配置文件目录(%APPDATA%\Microsoft\Credentials、%LOCALAPPDATA%\Microsoft\Credentials),且默认安全描述符仅允许凭据所属用户访问。SYSTEM账户默认未加载普通用户的配置文件,也没有访问这些凭据的权限,因此直接调用CredEnumerate/CredRead会返回空结果。
方案一:注入凭据时修改安全描述符(优先推荐)
由于你完全控制凭据的注入流程,可在调用CredWrite时为凭据添加允许SYSTEM账户访问的安全描述符,让SYSTEM进程直接有权限枚举和删除这些凭据。
具体实现步骤
- 创建包含SYSTEM权限的安全描述符
- 使用
InitializeSecurityDescriptor初始化空的安全描述符 - 通过
CreateWellKnownSid传入WinLocalSystemSid获取SYSTEM账户的SID - 使用
AddAccessAllowedAce向安全描述符中添加ACE,授予SYSTEM账户GENERIC_READ | GENERIC_WRITE | DELETE权限(满足枚举、读取、删除需求)
- 使用
- 注入凭据时指定安全描述符
- 填充
CREDENTIAL结构体时,将pSecurityDescriptor成员指向上述创建的安全描述符
- 填充
代码片段示例
// 获取SYSTEM账户的SID BYTE systemSid[SECURITY_MAX_SID_SIZE]; DWORD sidSize = sizeof(systemSid); if (!CreateWellKnownSid(WinLocalSystemSid, NULL, systemSid, &sidSize)) { // 处理错误 } // 初始化安全描述符 SECURITY_DESCRIPTOR sd; if (!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION)) { // 处理错误 } // 创建ACL并添加ACE ACL acl; if (!InitializeAcl(&acl, sizeof(acl), ACL_REVISION)) { // 处理错误 } if (!AddAccessAllowedAce(&acl, ACL_REVISION, GENERIC_READ | GENERIC_WRITE | DELETE, systemSid)) { // 处理错误 } // 将ACL关联到安全描述符 if (!SetSecurityDescriptorDacl(&sd, TRUE, &acl, FALSE)) { // 处理错误 } // 填充CREDENTIAL结构体并调用CredWrite CREDENTIAL cred = {0}; cred.Type = CRED_TYPE_GENERIC; // 根据凭据类型调整 cred.TargetName = L"YourFakeCredentialTarget"; cred.CredentialBlobSize = ...; cred.CredentialBlob = ...; cred.pSecurityDescriptor = &sd; // 指定自定义安全描述符 if (!CredWrite(&cred, 0)) { // 处理错误 }
方案二:SYSTEM进程加载用户配置文件
如果需要访问所有用户的凭据(包括非你注入的),可通过SYSTEM进程加载目标用户的配置文件,让CredMan API能访问到该用户的凭据存储目录。
关键步骤
- 枚举本地用户账户:使用
NetUserEnum获取本地所有用户的用户名 - 获取用户登录令牌:调用
LogonUser(注意:若无用户密码,此方法受限;可针对性处理你注入凭据的目标用户) - 加载用户配置文件:使用
LoadUserProfile加载目标用户的配置文件,此时SYSTEM进程就能访问该用户的凭据目录 - 枚举/删除凭据:调用
CredEnumerate/CredDelete完成操作 - 清理资源:操作完成后调用
UnloadUserProfile释放配置文件
注意事项
- 此方法需要处理用户令牌的获取,若无用户密码则无法调用
LogonUser,仅适用于你知道目标用户凭据或能通过其他方式获取令牌的场景 - 加载用户配置文件可能会影响用户当前的会话状态,需谨慎处理
验证说明
你提到LaZagne在用户上下文能找到凭据、SYSTEM上下文找不到,正是因为LaZagne默认依赖用户配置文件的加载,且默认凭据的安全描述符拒绝SYSTEM访问。修改注入凭据的安全描述符后,SYSTEM进程调用CredMan API就能正常枚举到你注入的虚假凭据。
内容的提问来源于stack exchange,提问作者Arif RiseAgainstHate
相关产品推荐
相关产品推荐

