渗透基础——域内用户口令策略的获取
0x00 前言
在域渗透中,我们在口令爆破前需要先获得域内用户的口令策略,以免在口令爆破时锁定用户
站在防御的角度,需要识别出口令爆破的攻击行为并采取防御措施
本文将要介绍获取域内用户口令策略的常用方法,结合利用思路分享检测域用户口令爆破的方法。
0x01 简介
本文将要介绍以下内容:
- 修改域用户口令策略的方法
- 域外获取域用户口令策略的方法
- 域内获取域用户口令策略的方法
- 检测方法
0x02 基础知识
我们需要关注以下口令策略:
- Maximum password age,表示密码过期的时间,默认为 42
- Minimum password length,表示密码的最小长度,默认为 7
- Account lockout duration,表示被锁定的帐户在自动解锁前保持锁定的分钟数,默认为 30
- Account lockout threshold,表示导致用户帐户被锁定的失败登录尝试次数,默认为 5
- Reset account lockout counter after,表示失败登录尝试计数器重置为 0 次错误登录尝试之前,失败登录尝试后必须经过的分钟数,默认为 30
0x03 修改域用户口令策略的方法
域用户的口令策略默认保存在域内的默认组策略(Default Domain Policy) 中,guid 为 {31B2F340-016D-11D2-945F-00C04FB984F9}
在域控制器上打开 Group Policy Management
,找到当前域,选择 Default Domain Policy
,右键选择编辑,如下图
依次打开 Computer Configuration
-> Policies
-> Windows Settings
-> Security Settings
-> Account Policies
,如下图
根据提示修改对应的选项
修改以后可以选择立即更新组策略使其立即生效,命令行输入:
gpupdate
0x04 域外获取域用户口令策略的方法
1.Kali 系统通过 ldapsearch 获取域用户口令策略
测试环境如下图
前提:我们能够访问到域控制器(DC) 的 389 端口,并且我们至少已经获得了域内一个普通用户的口令
这个测试环境中,我们获得了域内普通用户 testa
的口令为 DomainUser123!
连接命令如下:
ldapsearch -x -H ldap://192.168.1.1:389 -D "CN=testa,CN=Users,DC=test,DC=com" -w DomainUser123! -b "DC=test,DC=com" | grep replUpToDateVector -A 13
参数说明: -x 进行简单认证 -H 服务器地址 -D 用来绑定服务器的 DN -w 绑定 DN 的密码 -b 指定要查询的根节点
使用 grep 命令对输出结果进行筛选, grep replUpToDateVector -A 13
是为了只显示出同密码策略相关的项
输出结果如下图
包括以下需要的信息:
- maxPwdAge: -36288000000000
- minPwdLength: 10
- lockoutDuration: -18600000000
- lockoutThreshold: 15
- lockOutObservationWindow: -18600000000
换算成以秒为单位要除以 10000000
例如:
(1)maxPwdAge: -36288000000000
36288000000000/10000000=3628800s
3628800/86400=42d
maxPwdAge=42d
(2)lockoutDuration: -18600000000
-18600000000/10000000=1860s
1860/60=31m
lockoutDuration=31m
2.Windows 系统通过 PowerShell 获取域用户口令策略
测试环境如下图
前提:我们能够访问到域控制器(DC) 的 389 端口,并且我们至少已经获得了域内一个普通用户的口令
这个测试环境中,我们获得了域内普通用户 testa
的口令为 DomainUser123!
这里需要使用 powershell 模块 Active Directory
这里不必专门安装 powershell 模块 Active Directory,可以通过调用 Microsoft.ActiveDirectory.Management.dll 的方式解决
Microsoft.ActiveDirectory.Management.dll 在安装 powershell 模块 Active Directory 后生成,我已经提取出来并上传至 github: https://github.com/3gstudent/test/blob/master/Microsoft.ActiveDirectory.Management.dll
此外,还需要使用凭据信息,所以完整的 Powershell 命令如下:
$uname="testa"
$pwd=ConvertTo-SecureString "DomainUser123!" -AsPlainText –Force
$cred=New-Object System.Management.Automation.PSCredential($uname,$pwd)
import-module .\Microsoft.ActiveDirectory.Management.dll
Get-ADDefaultDomainPasswordPolicy -Server 192.168.1.1 -Credential $cred -Verbose
输出结果如下图
3.Windows 系统通过域共享文件获取域用户口令策略
测试环境同上
域用户的口令策略保存在域内的默认组策略(Default Domain Policy) 中,guid 为 {31B2F340-016D-11D2-945F-00C04FB984F9}
这里可以通过通过访问域内共享文件夹\SYSVOL 进行查看
前提:需要提供域用户的凭据
这个测试环境中,我们获得了域内普通用户 testa
的口令为 DomainUser123!
通用位置为: \\<DOMAIN Controller IP>\SYSVOL\<DOMAIN>\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf
测试环境的位置为: \\192.168.1.1\SYSVOL\test.com\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf
输出结果如下图
0x05 域内获取域用户口令策略的方法
前提是已经获得了域内一台主机的权限
测试环境如下图
1.通过 PowerShell 获取域用户口令策略
import-module .\Microsoft.ActiveDirectory.Management.dll
Get-ADDefaultDomainPasswordPolicy
2.通过 c++获取域用户口令策略
使用 API NetUserModalsGet
来获取域用户的口令策略
结构体 USER_MODALS_INFO_0
保存全局密码信息
结构体 USER_MODALS_INFO_3
保存锁定信息
根据参考资料中的代码,添加查询用户锁定信息的功能,代码已上传至 github,地址如下:https://github.com/3gstudent/Homework-of-C-Language/blob/master/GetDomainPasswordPolicy.cpp
代码分别使用结构体 USER_MODALS_INFO_0
和 USER_MODALS_INFO_3
对用户的口令策略进行查询
输出结果如下图
3.通过域共享文件获取域用户口令策略
通用位置为: \\<DOMAIN>\SYSVOL\<DOMAIN>\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf
测试环境的位置为: \\test.com\SYSVOL\test.com\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf
0x06 检测方法
域用户的属性中包括两个有用的信息:
- badPwdCount,记录用户口令错误的次数
- lastbadpasswordattempt,记录上次口令输入错误的登陆时间
我们在检测时可以通过查询这两个属性来识别是否遭受口令爆破的攻击,具体方法如下:
1.直接在域控制器上查询
Powershell 代码如下:
Get-ADUser -Filter * -Properties *| select name,lastbadpasswordattempt,badpwdcount|fl
输出结果如下图
2.在域内普通用户登录的主机上
(1) 使用 powerview
Get-NetUser | select name,badpasswordtime,badpwdcount
输出结果如下图
(2) 使用 c++
https://github.com/3gstudent/Homework-of-C-Language/blob/master/CheckUserBadPwdPolicy.cpp
输出结果如下图
3.在域外的 kali 系统上
(1) 使用 ldapsearch
ldapsearch -x -H ldap://192.168.1.1:389 -D "CN=testa,CN=Users,DC=test,DC=com" -w DomainUser123! -b "DC=test,DC=com" -b "DC=test,DC=com" "(&(objectClass=user)(objectCategory=person))"|grep -E "cn:|badPwdCount|badPasswordTime"
输出结果如下图
注:如果口令输入正确,那么 badPwdCount 会被清零
0x07 小结
本文列举了获取域内用户口令策略的常用方法,介绍了如何在多种环境下识别出口令爆破的行为。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

上一篇: 渗透基础 —— 活动目录信息的获取
下一篇: Jvm 常量池
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论