渗透基础——通过 LDAP 协议暴力破解域用户的口令
0x00 前言
在域渗透中,如果已经掌握了一些域用户的口令,通常会选择寻找口令规律,生成字典文件,尝试对其他域用户的口令进行暴力破解。站在防御的角度,需要确保域用户没有使用存在规律的弱口令,也需要能够发现暴力破解域用户口令的行为。
本文将要分别介绍在域内和域外暴力破解域用户口令的常用方法,结合利用思路,介绍检测方法。
0x01 简介
本文将要介绍以下内容:
- 域内暴力破解域用户口令的方法
- 域外暴力破解域用户口令的方法
- 检测方法
0x02 暴力破解域用户口令需要注意的问题
多次口令输入错误会导致用户帐户被锁定,默认设置的错误次数为 5
用户帐户被锁定后,默认需要等待 30 分钟才能恢复使用
最后一次口令输入错误的时间会被记录,无法通过修改 LDAP 数据进行清除,提示如下:
Error 0x209A Access to the attribute is not permitted because the attribute is owned by the Security Accounts Manager (SAM).
用户帐户被锁定后,即使输入正确的口令,也会提示口令错误
0x03 域内暴力破解域用户口令的方法
1.获得域内用户的口令策略,避免帐户被锁定
获取口令策略的详细方法可参考上篇文章 《渗透基础——域内用户口令策略的获取》
2.获得所有域用户的列表
获取的详细方法可参考之前的文章 《渗透基础——活动目录信息的获取》
这里需要额外对用户的属性进行判断,去除被禁用和被锁定的用户
(1) 识别被禁用的用户
标识用户是否被禁用的位置位于 userAccountControl
属性中,具体的位置为 0x0002
如下图
使用 PowerView 查看所有用户的 ACCOUNTDISABLE
属性,命令如下:
Get-NetUser | select name,useraccountcontrol
输出结果如下图
查看指定用户 ACCOUNTDISABLE
属性的具体值,命令如下:
Get-NetUser test2| select useraccountcontrol | ConvertFrom-UACValue -ShowAll
输出结果如下图
能够获得用户 test2 具有以下属性:
- ACCOUNTDISABLE
- NORMAL_ACCOUNT
- DONT_EXPIRE_PASSWORD
(2) 识别被锁定的用户
虽然用户的 ACCOUNTDISABLE
属性中偏移 0x0010
处标记为 LOCKOUT
,如下图
但这个位置的值并不能用来判断当前用户是否被锁定
我们可以通过读取用户的 badPwdCount
属性和 lockoutTime
属性进行判断
使用 PowerView 查看所有用户的 badPwdCount
属性和 lockoutTime
属性,命令如下:
Get-NetUser | select name,badPwdCount,lockoutTime
输出结果如下图
很明显,可以发现用户 testa 处于被锁定的状态
3.使用 DomainPasswordSpray 进行口令爆破
地址:https://github.com/dafthack/DomainPasswordSpray
原理:通过 ADSI(ActiveDirectoryServicesInterface)(活动目录服务接口)尝试进行 LDAP 查询,获得结果
实例如下:
Invoke-DomainPasswordSpray -UserList .\users.txt -Password DomainUser123! -Verbose
输出结果如下图
注:DomainPasswordSpray 支持筛选用户的功能,获得所有用户的列表,排除被禁用和被锁定的用户
命令如下:
Get-DomainUserList -RemoveDisabled -RemovePotentialLockouts
我在我的测试环境(dc:Server2012R2) 下这个功能出现 bug,无法识别出被锁定的用户 testa
如下图
实际上用户 testa 的状态被锁定,如下图
个人猜测产生 bug 的原因如下:
DomainPasswordSpray 通过用户的 ACCOUNTDISABLE
属性中偏移 0x0010
处(标记为 LOCKOUT
) 来判断用户是否被锁定,对应代码位置: https://github.com/dafthack/DomainPasswordSpray/blob/master/DomainPasswordSpray.ps1#L408
我的测试环境下得出的结论是不能通过这个值进行判断,正确的方法是通过 badPwdCount
属性和 lockoutTime
属性进行识别
0x04 域外暴力破解域用户口令的方法
1.Kali 系统通过 ldapsearch 暴力破解域用户口令
在之前的文章文章 《渗透基础——活动目录信息的获取》 介绍了 kali 系统下使用 ldapsearch 连接 LDAP 服务器的方法
这里可以简单的加一个循环实现暴力破解,完整的 bash 命令如下:
for i in $(cat test.txt); do echo -e "\n$i";ldapsearch -x -H ldap://192.168.1.1:389 -D "CN="$i",CN=Users,DC=test,DC=com" -w DomainUser123! -b "DC=test,DC=com" |grep "# numEntrie";done
test.txt 保存所有用户名,如果口令正确,输出查询结果的个数,如果口令错误,返回验证错误: ldap_bind: Invalid credentials (49)
输出结果如下图
成功暴力破解出用户 testb 的口令
2.Windows 系统通过 Invoke-DomainPasswordSprayOutsideTheDomain 暴力破解域用户口令
DomainPasswordSpray 的功能比较完整,但不支持域外的使用,所以我在 DomainPasswordSpray 的基础上做了一些修改,使其支持域外的使用
具体修改的位置如下:
原版中修改 LDAP 查询的语句:
$DomainContext = New-Object System.DirectoryServices.ActiveDirectory.DirectoryContext("domain",$Domain)
$DomainObject = [System.DirectoryServices.ActiveDirectory.Domain]::GetDomain($DomainContext)
$CurrentDomain = "LDAP://" + ([ADSI]"LDAP://$Domain").distinguishedName
替换为 LDAP 的查询语句,示例: "192.168.1.1/DC=test,DC=com"
最终的完整查询语句为: LDAP://192.168.1.1/DC=test,DC=com
由于是在域外进行暴力破解,无法获得域用户的口令策略,所以我移除了 DomainPasswordSpray 中获得口令策略的功能
我已经将修改后的代码上传至 github,地址如下:https://github.com/3gstudent/Homework-of-Powershell/blob/master/Invoke-DomainPasswordSprayOutsideTheDomain.ps1
域外使用的示例命令如下:
Invoke-DomainPasswordSprayOutsideTheDomain -Domain "192.168.1.1/DC=test,DC=com" -UserList .\user.txt -Password DomainUser123! -Verbose
输出结果如下图
0x05 利用思路
1.域内暴力破解域用户口令
流程如下:
(1) 获得域内用户的口令策略
根据 lockoutThreshold
的数值决定尝试的次数,避免帐户被锁定
(2) 获得域用户列表
列出所有域用户后,需要对用户的属性进行判断,去除被禁用和被锁定的用户
(3) 尝试破解
2.域外暴力破解域用户口令
如果已经获得了一个用户的口令,那么可以先读取域内用户的口令策略和用户列表,方法同上
如果没有任何用户的口令,只能进行盲目的尝试
0x06 检测方法
域用户属性中的 lastbadpasswordattempt
能够记录上次口令输入错误的登陆时间,这可以作为识别暴力破解攻击的依据
badPwdCount
属性会记录用户口令错误的次数,但是用户输入正确的口令后,这个属性会被清零,无法作为判断的依据
如果攻击者从域内发起攻击,那么攻击者已经掌握了域内用户的口令策略和用户列表,站在防御的角度,需要确保域内用户的口令不存在规律,避免多个用户使用同一口令的情况
日志(4625 - An account failed to log on) 能够记录登录失败的事件,例如 Kali 系统通过 ldapsearch 暴力破解域用户口令时产生的日志如下图
使用 kerbrute 进行暴力破解不会产生日志(4625 - An account failed to log on),但是可以通过日志(4768 - A Kerberos authentication ticket (TGT) was requested 和 4771 - Kerberos pre-authentication failed) 记录
0x07 小结
本文分别介绍了在域内和域外暴力破解域用户口令的常用方法,介绍了我在测试 DomainPasswordSpray 时发现的一个 bug(需要在更多的环境进行测试),基于 DomainPasswordSpray 实现了域外暴力破解,结合利用思路,介绍检测方法。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: 渗透基础 —— 活动目录信息的获取
下一篇: Jvm 常量池
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论