寻求可向Windows内部票据存储注入Kerberos票据与认证器的WINAPI
向Windows Kerberos存储注入自定义票据的WINAPI方案
1. 首选API:CredWrite(结合KERB_CREDENTIAL结构)
Windows凭据管理器提供的CredWrite API支持将Kerberos凭据注入系统存储,你需要构造符合Kerberos协议的KERB_CREDENTIAL结构体,填入已获取的票据和认证信息:
核心步骤
- 初始化
KERB_CREDENTIAL结构:- 指定版本为
KERB_CREDENTIAL_V5 - 设置
Flags(例如KERB_CREDENTIAL_FLAGS_INITIAL表示初始票据) - 将加密的Client-to-server ticket填入
Ticket字段 - 补充Session Key、Authenticator等相关字段的内容
- 指定版本为
- 构造上层
CREDENTIAL结构,指定类型为CRED_TYPE_KERBEROS,将KERB_CREDENTIAL作为CredentialBlob传入 - 调用
CredWrite完成凭据注入
示例代码片段:
#include <windows.h> #include <wincred.h> #include <ntsecapi.h> BOOL InjectKerberosCred() { KERB_CREDENTIAL kerbCred = {0}; kerbCred.Version = KERB_CREDENTIAL_V5; kerbCred.Flags = KERB_CREDENTIAL_FLAGS_INITIAL; // 填充Ticket字段:传入你已获取的加密Client-to-server ticket kerbCred.Ticket.Length = YOUR_TICKET_LENGTH; kerbCred.Ticket.MaximumLength = YOUR_TICKET_LENGTH; kerbCred.Ticket.Buffer = (PWSTR)YOUR_TICKET_DATA; // 填充SessionKey、Authenticator等其他必要字段 // ... CREDENTIAL cred = {0}; cred.Type = CRED_TYPE_KERBEROS; cred.TargetName = L"YOUR_RESOURCE_SPN"; // 资源的服务主体名称 cred.CredentialBlobSize = sizeof(KERB_CREDENTIAL); cred.CredentialBlob = (LPBYTE)&kerbCred; cred.Persist = CRED_PERSIST_SESSION; // 仅当前会话有效,可选其他持久化级别 return CredWrite(&cred, 0); }
2. 底层控制方案:LsaCallAuthenticationPackage
如果需要更精细的Kerberos凭据管理,可以通过LSA(本地安全授权)API直接调用Kerberos认证包:
核心步骤
- 调用
LsaRegisterLogonProcess获取LSA会话句柄 - 构造
KERB_ADD_CREDENTIALS_REQUEST结构,填入你的票据和认证信息 - 通过
LsaCallAuthenticationPackage发送KerbAddCredentialsMessage类型的请求,完成凭据注入
此方法需要对LSA API和Kerberos协议有更深入的了解,适合需要自定义凭据生命周期的场景。
关于返回的加密时间戳
资源返回的加密时间戳(用Client/Server Session Key加密的Authenticator时间戳)主要用于Kerberos会话的有效性验证,不需要存入系统凭据存储。系统在后续与资源通信时,会自动处理Kerberos的会话校验逻辑。
验证与注意事项
- 调用上述API需要管理员权限或对应的凭据访问权限
- 必须确保
KERB_CREDENTIAL结构的字段完全符合Kerberos V5协议规范,否则注入的凭据无法被系统识别 - 可以使用系统命令
klist get <资源SPN>查看注入的票据,验证是否成功
内容的提问来源于stack exchange,提问作者Zohar81
相关产品推荐
相关产品推荐

