gpt4 book ai didi

c++ - 如果我被冒充,为什么 Win32 API 函数 CredEnumerate() 会返回 ERROR_NOT_FOUND?

转载 作者:太空宇宙 更新时间:2023-11-04 03:07:07 25 4
gpt4 key购买 nike

我已经编写了一些示例代码,当我在普通用户帐户的上下文中从 Windows 命令提示符调用时,使用 CredEnumerate() 转储所有用户保存的凭据。但是,我真的希望能够从 SYSTEM 用户上下文执行此操作,因此我已经从 SYSTEM cmd 提示符测试了我的程序。

当我以 SYSTEM 身份运行我的程序时,我会像这样运行 LogonUser:

bLoggedOn = LogonUser(userName.c_str(), domain.c_str(), password.c_str(), LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &userToken_);

然后我在 token 上运行 ImpersonateLoggedOnUser() 以提供本地用户的安全上下文。在此之后我做:

bOk = CredEnumerate(NULL, 0, &count, &pCredentials);

而且我希望这会以与我没有从系统进入并被冒充的方式相同的方式返回凭据。任何人都可以发现我遗漏的任何内容以真正将自己置于用户的上下文中吗?

最佳答案

我想我应该自己回答这个问题,因为我已经花了很长时间研究如何做到这一点,而且我不确定它是否广为人知。 CredEnumerate/CredRead 永远不会提供域密码的密码信息,无论您处于什么进程上下文或您拥有什么 token ,尽管它似乎暗示了 MSDN。访问保存的凭据信息的唯一方法是使用 lsasrv.dll 中未记录的函数 LSAICryptUnprotectData()。这可以解密您在 %APPDATA%\Microsoft\Credentials 中找到的文件,并且可以提供与 CredEnumerate 相同的数据结构,除了填写的密码。唯一的问题是这必须在 lsass.exe 的进程上下文中完成( Windows 安全子系统),无需设置权限等就足以让正常进程有权执行此操作。如果你是一名黑客,你可以通过执行 CreateRemoteThread() 将线程注入(inject) lsass.exe 来做到这一点,或者如果你试图以合法的方式做到这一点,即你正在以某种方式扩展 Windows 操作系统对于第三方应用程序,就像我一样,您可以通过创建一个 lsass 将加载的 Windows 身份验证包来实现。然后,此 AP 可以使用命名管道或某种此类方法来允许与您的其余代码进行交互。

关于c++ - 如果我被冒充,为什么 Win32 API 函数 CredEnumerate() 会返回 ERROR_NOT_FOUND?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3678393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com