根据输入的凭据创建安全令牌并针对 Active Directory 进行验证后,密码将不再保留。它不能在其他地方检索和重用。只剩下令牌。这是设计使然。
更新:
我进一步挖掘以支持我的案例,它与上面的不太一样,但最终结果是一样的。使用的密码runas.exe
似乎不可用。网络凭据未针对 AD 进行验证,回想起来这很有意义,因为您经常使用/netonly
远程、不受信任的域来处理:根据定义,您无法验证来自本地系统的远程凭据。来自 MSDN:
这是 flag 的信息LOGON_NETCREDENTIALS_ONLY
,与CreateProcessWithLogonW
.
登录,但仅在网络上使用指定的凭据。新进程使用与调用者相同的令牌,但系统会在 LSA 中创建一个新的登录会话,并且该进程使用指定的凭据作为默认凭据。
此值可用于创建在本地使用与远程使用不同的凭据集的进程。这在没有信任关系的域间场景中很有用。
系统不验证指定的凭据。因此,该进程可以启动,但它可能无法访问网络资源。
好的,所以由于它无法验证凭据并获取令牌,因此它必须将密码存储在内存中的某个位置,因为它必须稍后通过线路将它们传递给 SSPI 等。所以,我们可以从启动的进程中获取它们吗?runas.exe
? 让我们来看看:
PS> runas /netonly /user:foo\bar powershell.exe
Enter the password for foo\bar: ******
我从字面上用于foo\bar
上面的域和用户。如前所述,它未经验证。我输入12345
了密码。上面的行将启动一个新的 powershell 实例。所以,从那个新实例中,让我们看看默认的网络凭据:
PS> [System.Net.CredentialCache]::DefaultNetworkCredentials
UserName Domain
-------- ------
哦,好吧,不走运:那里什么都没有。我的猜测是,凭证被保护在内核内存的某个加密部分中,可能是 LSA(本地安全机构)无法被窥探进程所触及。