KaiWn 发布于2022年11月8日 分享 发布于2022年11月8日 0x00 前言 在域渗透中,如果已经掌握了部分域用户的密码,通常会选择寻找密码规则,生成字典文件,尝试暴力破解其他域用户的密码。 从防御的角度来说,既要保证域用户不使用正规的弱密码,又要能够发现暴力破解域用户密码的行为。 本文将介绍域内外暴力破解域用户密码的常用方法,并结合利用思路介绍检测方法。 0x01 简介 本文将介绍以下内容: 一种通过域暴力破解域用户密码的方法 域外暴力破解域用户密码的方法 检测方法 0x02 暴力破解域用户口令需要注意的问题 多次密码输入错误会导致用户账号被锁定,默认错误号为5。 用户账号锁定后,默认需要30分钟才能恢复使用。 将记录最后一次密码输入错误的时间,这不能通过修改LDAP数据来清除。提示如下: 错误0x209A不允许访问该属性,因为该属性由安全帐户管理器(SAM)拥有。 用户账号被锁定后,即使输入了正确的密码,也会提示密码错误。 0x03 域内暴力破解域用户口令的方法 1.获得域内用户的口令策略,避免帐户被锁定 获取密码策略的详细方法请参考之前的文章《渗透基础——域内用户口令策略的获取》。 2.获得所有域用户的列表 详细获取方法请参考之前的文章《渗透基础——活动目录信息的获取》。 这里需要判断用户的属性,去除禁用和锁定的用户。 (1)识别被禁用的用户 标识用户是否被禁用的位置位于userAccountControl属性中,具体位置为0x0002。 如下图 参考资料: https://support . Microsoft . com/en-us/help/305144/how-to-use-user account control-to-manipulate-user-account-properties 使用PowerView查看所有用户的ACCOUNTDISABLE属性。该命令如下所示: Get-NetUser |选择名称,useraccountcontrol 输出结果如下 检查指定用户ACCOUNTDISABLE属性的具体值,命令如下: get-net user test 2 | select user account control | convert from-UAC value-ShowAll 输出结果如下 可以获得的用户test2具有以下属性: 帐户禁用 普通_账户 DONT _到期_密码 (2)识别被锁定的用户 尽管用户的ACCOUNTDISABLE属性中的偏移量0x0010被标记为锁定,如下图所示 但是,此位置的值不能用于确定当前用户是否被锁定。 我们可以通过读取用户的badPwdCount属性和lockoutTime属性来判断。 使用PowerView查看所有用户的badPwdCount属性和lockoutTime属性。该命令如下所示: Get-NetUser | select name,badPwdCount,lockoutTime 输出结果如下 显然,可以发现用户testa被锁定。 3.使用DomainPasswordSpray进行口令爆破 地址: https://github.com/dafthack/DomainPasswordSpray 原理:通过ADSI(活动目录服务接口)尝试LDAP查询,得到结果。 例子如下: invoke-domain passwordspray-UserList。\ users . txt-密码域用户123!-冗长 输出结果如下 注: DomainPasswordSpray支持过滤用户、获取所有用户列表以及排除禁用和锁定用户的功能。 该命令如下所示: get-domain userlist-remove disabled-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 ';LDAP search-x-H LDAP://192 . 168 . 1 . 1:389-D ' CN=' $ I ',CN=Users,DC=test,DC=com' -w DomainUser123!-b ' DC=测试,DC=com ' | grep ' # numEntrie ';完成的 Test.txt保存所有用户名,如果密码正确则输出查询结果数,如果密码错误则返回身份验证错误:LDAP _ bind:invalid credentials(49) 输出结果如下 成功通过暴力破解了用户testb的密码。 2.Windows系统通过Invoke-DomainPasswordSprayOutsideTheDomain暴力破解域用户口令 DomainPasswordSpray的功能比较全,但是不支持域外使用,所以我在DomainPasswordSpray的基础上做了一些修改,使其支持域外使用。 修改的具体位置如下: 在原始版本中,修改LDAP查询语句: $DomainContext=新对象系统。directory services . activedirectory . directory context(' Domain ',$Domain) $DomainObject=[System。directory services . activedirectory . domain]:get domain($ domain context) $ current Domain=' LDAP://'([ADSI]' LDAP://$ Domain ')。distinguishedName 替换LDAP的查询语句,例如:' 192 . 168 . 1 . 1/DC=测试,DC=com ' 最终完整的查询语句是:LDAP://192.168.1.1/DC=test,DC=com。 因为域外的暴力破解无法获取域用户的密码策略,所以我在DomainPasswordSpray中去掉了获取密码策略的功能。 我已经将修改后的代码上传到github,地址如下: https://github . com/3g student/home-of-Powershell/blob/master/Invoke-domain passwordsprayoutsidethedomain . PS1 域外使用的命令示例如下: invoke-Domain passwordsprayoutsidethedomain-Domain ' 192 . 168 . 1 . 1/DC=test,DC=com' -UserList。\ user . txt-密码域User123!-冗长 输出结果如下 0x05 利用思路 1.域内暴力破解域用户口令 流程如下: (1)获得域内用户的口令策略 根据lockoutThreshold的值,确定防止帐户被锁定的尝试次数。 (2)获得域用户列表 列出所有域用户后,需要判断用户的属性,去掉禁用和锁定的用户。 (3)尝试破解 2.域外暴力破解域用户口令 如果已经获取了用户的密码,可以先读取域内用户的密码策略和用户列表,方法同上。 如果没有任何一个用户的密码,我们只能盲目尝试。 0x06 检测方法 域属性中的Lastbadpasswordattempt可以记录最后一次密码输入错误的登录时间,可以作为识别暴力攻击的依据。 badPwdCount属性记录了用户密码错误的次数,但用户输入正确密码后,该属性会被清除,不能作为判断依据。 如果攻击者从域中发起攻击,那么攻击者已经掌握了域中用户的密码策略和用户列表。从防御的角度来说,需要保证域内用户的密码是不规则的,避免出现多个用户使用同一个密码的情况。 日志(4625-帐户登录失败)可以记录登录失败事件。比如Kali系统通过ldapsearch暴力破解域用户密码时生成的日志如下 使用Kerberos进行暴力破解不会生成日志(4625-帐户登录失败),但可以通过日志记录(4768-请求了Kerberos身份验证票证(TGT ), 4771-Kerberos预身份验证失败)。 0x07 小结 本文介绍了域内外暴力破解域用户密码的常用方法,以及我在测试DomainPasswordSpray时发现的一个bug(需要在更多环境下测试)。基于DomainPasswordSpray实现了域外暴力破解,并结合利用的思想介绍了检测方法。 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子