2

我正在寻找一种方法来将当前会话的网络凭据捕获到一个我可以稍后传递的变量中......

关键是在我有帐户访问/特权的外部域上执行命令,但源域和目标域之间没有信任。

首先,我们在使用 runas 命令 (runas /netonly /user:domian\account powershell) 生成的 powershell 中运行

从这里我可以做几乎所有我想做的事情,除了在任务调度程序中创建一个事件而不将用户名/密码硬编码到命令行中

调用命令 -computer $destination -scriptblock {schtasks -ru domain\account -rp 密码}

我想做的是像

$username = 获取当前会话网络用户名($(whoami) 显示实际的本地 longon 帐户,而不是产生 powershell 窗口的 runas 帐户)

$password = 获取执行 RunAs 命令时输入的密码

4

1 回答 1

4

根据输入的凭据创建安全令牌并针对 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(本地安全机构)无法被窥探进程所触及。

于 2013-03-28T18:07:32.633 回答