渗透基础——通过 LDAP 协议暴力破解域用户的口令

发布于 2024-10-19 16:54:14 字数 7575 浏览 8 评论 0

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

如下图

Alt text

参考资料:https://support.microsoft.com/en-us/help/305144/how-to-use-useraccountcontrol-to-manipulate-user-account-properties

使用 PowerView 查看所有用户的 ACCOUNTDISABLE 属性,命令如下:

Get-NetUser | select name,useraccountcontrol

输出结果如下图

Alt text

查看指定用户 ACCOUNTDISABLE 属性的具体值,命令如下:

Get-NetUser test2| select useraccountcontrol | ConvertFrom-UACValue -ShowAll

输出结果如下图

Alt text

能够获得用户 test2 具有以下属性:

  • ACCOUNTDISABLE
  • NORMAL_ACCOUNT
  • DONT_EXPIRE_PASSWORD

(2) 识别被锁定的用户

虽然用户的 ACCOUNTDISABLE 属性中偏移 0x0010 处标记为 LOCKOUT ,如下图

Alt text

但这个位置的值并不能用来判断当前用户是否被锁定

我们可以通过读取用户的 badPwdCount 属性和 lockoutTime 属性进行判断

使用 PowerView 查看所有用户的 badPwdCount 属性和 lockoutTime 属性,命令如下:

Get-NetUser | select name,badPwdCount,lockoutTime

输出结果如下图

Alt text

很明显,可以发现用户 testa 处于被锁定的状态

3.使用 DomainPasswordSpray 进行口令爆破

地址:https://github.com/dafthack/DomainPasswordSpray

原理:通过 ADSI(ActiveDirectoryServicesInterface)(活动目录服务接口)尝试进行 LDAP 查询,获得结果

实例如下:

Invoke-DomainPasswordSpray -UserList .\users.txt -Password DomainUser123! -Verbose

输出结果如下图

Alt text

注:DomainPasswordSpray 支持筛选用户的功能,获得所有用户的列表,排除被禁用和被锁定的用户

命令如下:

Get-DomainUserList -RemoveDisabled -RemovePotentialLockouts

我在我的测试环境(dc:Server2012R2) 下这个功能出现 bug,无法识别出被锁定的用户 testa

如下图

Alt text

实际上用户 testa 的状态被锁定,如下图

Alt text

Alt text

个人猜测产生 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)

输出结果如下图

Alt text

成功暴力破解出用户 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

输出结果如下图

Alt text

0x05 利用思路

1.域内暴力破解域用户口令

流程如下:

(1) 获得域内用户的口令策略

根据 lockoutThreshold 的数值决定尝试的次数,避免帐户被锁定

(2) 获得域用户列表

列出所有域用户后,需要对用户的属性进行判断,去除被禁用和被锁定的用户

(3) 尝试破解

2.域外暴力破解域用户口令

如果已经获得了一个用户的口令,那么可以先读取域内用户的口令策略和用户列表,方法同上

如果没有任何用户的口令,只能进行盲目的尝试

0x06 检测方法

域用户属性中的 lastbadpasswordattempt 能够记录上次口令输入错误的登陆时间,这可以作为识别暴力破解攻击的依据

badPwdCount 属性会记录用户口令错误的次数,但是用户输入正确的口令后,这个属性会被清零,无法作为判断的依据

如果攻击者从域内发起攻击,那么攻击者已经掌握了域内用户的口令策略和用户列表,站在防御的角度,需要确保域内用户的口令不存在规律,避免多个用户使用同一口令的情况

日志(4625 - An account failed to log on) 能够记录登录失败的事件,例如 Kali 系统通过 ldapsearch 暴力破解域用户口令时产生的日志如下图

Alt text

使用 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

对风讲故事

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

无远思近则忧

文章 0 评论 0

久伴你

文章 0 评论 0

萌无敌

文章 0 评论 0

新一帅帅

文章 0 评论 0

莫多说

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文