通常来说,管理本地管理员帐户的登录凭证是很难考虑周全的。从设置强密码到在多台机器上设置独特密码,我们很少看到能够正确做到所有这些安全措施的情况。在我们渗透测试的大多数例子中,我们看到大部分域内计算机都配置了相同的本地管理员登录凭证。对于网络攻击者来说这简直是美味佳肴,因为它向攻击者敞开了横向访问整个网络系统的大门。
之前微软的一个修复方案是将本地管理员密码存储在LDAP上,作为计算机账户的一个机密属性。这一点可以通过使用微软的工具来自动实现,并且本地密码的复杂度也可以得到增强(自动改变)。理论上,这确实是一个很不错的解决方案。但实际上,它将会导致密码的明文存储,这一点看起来将不那么安全。之前微软在本地管理员凭证管理方面的尝试导致了本地管理员凭证暴露在域内所有用户面前(通过组策略引用)。GPP cpassword存储密码问题已经修复(参见安全脉搏之前<ruby版的GPP解密脚本gpp.rb>,所以之后我们就不再那么频繁地见到针对它的攻击。
LAPS(Local Administrator Password Solution,本地管理员密码解决方案)是微软发布的一款用来在LDAP上存储本地管理员密码的工具。只要一切都配置正确,那么该工具使用起来将非常不错。然而,如果你没有正确地设置LDAP属性的权限,那么可能会将本地管理员凭证暴露给域内的所有用户。
LAPS使用两个LDAP属性来存储本地管理员凭证,这两个属性分别是ms-MCS-AdmPwd(存储密码)和ms-MCS-AdmPwdExpirationTime(存储过期时间)。
微软建议将特定用户和组的扩展权限移动到这些属性中。这是一个不错的方法,但它正确设置起来将非常痛苦。长话短说,如果你正在使用LAPS,那么域内的某一个用户将能够读取到这些本地管理员凭证的明文信息。
然而,这并不总是用来进行特权提升,当你攻击敏感系统并进行特权提升之后,你可以使用该方法来获取一些关键信息和敏感数据。在我们演示的域中,LAPS部署默认允许所有域用户都有密码的读取权限。在实际环境中,也有可能是因为我们没有正确按照安装说明配置,从而导致这种严重错误。
使用一个PowerShell脚本将针对LAPS指定的域中所有电脑的LDAP属性组合在一起,并使用Scott Sutherland的Get-ExploitableSystems脚本(现在包含在PowerView中)作为模板。最终的脚本文件可以在我的GitHub上获取。
当使用一个没有读取凭证权限的用户时,将会得到下面的输出结果(但能够证明它们存在):
PS C:\> Get-LAPSPasswords -DomainController 192.168.1.1 -Credential DEMO\karl | Format-Table -AutoSize Hostname Stored Readable Password Expiration -------- ------ -------- -------- ---------- WIN-M8V16OTGIIN.test.domain 0 0 NA WIN-M8V16OTGIIN.test.domain 0 0 NA ASSESS-WIN7-TEST.test.domain 1 0 6/3/2015 7:09:28 PM
当使用一个有读取凭证权限的用户执行上面指令时,将会得到下面的输出结果:
PS C:\> Get-LAPSPasswords -DomainController 192.168.1.1 -Credential DEMO\administrator | Format-Table -AutoSize Hostname Stored Readable Password Expiration -------- ------ -------- -------- ---------- WIN-M8V16OTGIIN.test.domain 0 0 NA WIN-M8V16OTGIIN.test.domain 0 0 NA ASSESS-WIN7-TEST.test.domain 1 1 $sl+xbZz2&qtDr 6/3/2015 7:09:28 PM
该脚本的使用方法非常简单,并且一切结果都是以友好的表格形式显示,所以很容易将结果导出到CSV文件。
此外,LDAP是一个挖取敏感数据的重要位置。这里有两个很好的例子:
如果你碰巧安装了AdmPwd.PS 这个PowerShell模块(LAPS的一部分),那么通过下面的一行代码,你将可以获取到当前域中所有本地管理员凭证(假设你有这个权限):
foreach ($objResult in $colResults){$objComputer = $objResult.Properties; $objComputer.name|where {$objcomputer.name -ne $env:computername}|%{foreach-object {Get-AdmPwdPassword -ComputerName $_}}}
【原文:Running LAPS Around Cleartext Passwords 安全脉搏PulseO0O翻译整理发布】