Tenfk 发布于2022年11月8日 分享 发布于2022年11月8日 0x00 前言 在域环境中,域用户的凭证是非常重要的信息。为了增强安全性,域组策略将设置所有域用户密码的最大有效时间,并强制用户在过期时间后更改密码。 在实际环境中,有些域用户需要设置自己的密码永不过期,可以通过添加密码永不过期属性来实现。 在域渗透中,我们需要枚举密码永不过期的域用户,我们还需要能够设置密码永不过期的域用户。 从防御的角度来看,我们需要尽量减少密码永不过期的域用户的数量,我们还需要能够实时掌握域用户的列表。 因此,本文将介绍不同条件下枚举、添加和删除密码永不过期属性的多种方法、分析原理和开源代码。 0x01 简介 本文将介绍以下内容: 实现原则 枚举密码设置为永不过期的用户。 指定向用户添加“密码永不过期”属性的方法。 为用户指定删除“密码永不过期”属性的方法。 0x02 实现原理 域用户的密码永不过期属性保存在域用户的userAccountControl属性中。 userAccountControl属性由一个数字表示,它是几个特定属性的值的总和。 每个特定属性对应一个不同的值。请参考:https://support . Microsoft . com/en-us/help/305144/how-to-use-user account control-to-manipulate-user-account-properties。 下面是一个例子: 用户test1的userAccountControl属性的值为514,因此该用户的具体属性如下: 帐户禁用,2 普通_账户,512 计算方法是2 512=514 添加密码永不过期属性的方法: 永不过期密码属性的对应值是65536(DONT _过期_密码),因此您可以将65536加到用户帐户控制属性514的值上,并将其设置为66048。 注: 在程序设计中,为了可重用,采用的方法是与65536进行按位或运算(运算符|)。 按位或运算的运算规则:参与运算的两个数按二进制位进行或运算。只要对应的二进制位中有一位是1,结果位就是1;否则为0。 删除密码永不过期属性的方法: 将userAccountControl的属性值减去65536。 注: 在程序设计中,为了可重用,采用的方法是与65536进行按位异或运算(运算符)。 按位异或运算的运算规则:参与运算的两个数按二进制位进行异或。如果两个对应的位相同,则结果为0;否则为1。 查看密码永不过期属性的方法: userAccountControl的属性值是所有数值之和,所以我们无法通过简单的加减运算计算出userAccountControl的属性值是否包含65536。 这可以通过按位AND运算(运算符)来实现。 按位and运算的运算规则:参与运算的两个数按二进制位进行“与”运算,只有当两个数的二进制位同时为1时,结果才为1,否则为0。 查看密码永不过期属性的计算方法: userAccountControl属性的值与65536进行按位AND运算。如果结果是65536,则意味着密码永远不会过期。 0x03 枚举密码设置为永不过期的用户 在域控制器上,我们可以通过Active Directory用户和计算机查看每个域用户的帐户属性,可以看到用户的密码是否设置为永不过期,如下图所示。 下面介绍不同环境下的枚举方法。 1.从域内进行枚举的方法 (1)Windows系统使用Powershell ActiveDirectory模块 命令示例: 导入模块ActiveDirectory search-ad account-password never expires | FT Name 或者: 导入模块ActiveDirectory get-ADUser-filter *-properties Name,PasswordNeverExpires |其中{$_。password never expires-eq ' true ' } | FT Name (2)Windows系统使用PowerView https://github . com/powershell mafia/PowerSploit/blob/master/Recon/power view . PS1 命令示例: 显示指定用户的属性: 导入模块。\PowerView.ps1 get-net user test1 | select user account control | convert from-UAC value 如下图 筛选出所有符合条件的用户: 导入模块。\PowerView.ps1 ForEach($User in (Get-NetUser)) { if(($ user . user account control-band 65536)-eq 65536) { 写入输出user . Sam account name } } (3)Windows系统使用C#实现 使用命名空间系统。目录服务,详细代码已上传至github,地址如下: https://github。com/3g student/howork-of-C-Sharp/blob/master/List _ password永不过期_ user _ by LDAP。铯 如果使用当前用户的凭据,需要将代码目录条目de=新目录条目(' LDAP://' args[0],args[1],args[2]);替换为目录条目de=新目录条目(' LDAP://' args[0]); 测试如下图 (4)Kali系统通过ldapsearch枚举 命令示例: LDAP搜索-x-H LDAP://192。168 .1 .1:389-D ' CN=testa,CN=Users,DC=test,DC=com' -w DomainPassword123!-b ' DC=测试,DC=com ' '((对象类=用户)(对象类别=人))' grep用户帐户控制 测试如下图 获取用户帐户控制属性值后再同65536做按位与运算,获得最终结果 2.从域外进行枚举的方法 (1)Windows系统使用Powershell ActiveDirectory模块 命令示例: 导入模块。\微软ActiveDirectory。Management.dll $uname='test1 ' $ pwd=转换为安全字符串“域密码123!”-AsPlainTextForce $ cred=新对象系统管理。自动化。PS证书(uname,$pwd) 搜索广告账户服务器192。168 .1 .1-Credential $ cred-Verbose-密码永不过期| FT Name 或者: 导入模块。\微软ActiveDirectory。Management.dll $uname='test1 ' $ pwd=转换为安全字符串“域密码123!”-AsPlainTextForce $ cred=新对象系统管理。自动化。PS证书(uname,$pwd) 获取用户服务器192。168 .1 .1-Credential $ cred-filter *-属性名称,PasswordNeverExpires |其中{$_。密码永不过期-eq ' true ' } | FT Name 注: 域控制器默认安装ActiveDirectory模块,微软ActiveDirectory。Management.dll在安装powershell模块活动目录后生成,我已经提取出来并上传至github: https://github.com/3gstudent/test/blob/master/Microsoft.ActiveDirectory.Management.dll 对于未安装活动目录模块的系统,可以通过如下命令导入活动目录模块: 导入模块。\微软ActiveDirectory。Management.dll (2)Windows系统使用PowerView https://github。com/powershell mafia/powers loit/blob/master/Recon/power view。PS1 命令示例: 导入模块. PowerView.ps1 $uname='test1 ' $ pwd=转换为安全字符串“域密码123!”-AsPlainTextForce $ cred=新对象系统管理。自动化。PS证书(uname,$pwd) $ Users=Get-net user-Domain测试。com’-域控制器192。168 .1 .1-凭证$ cred ForEach($User in $Users) { if(($ user。用户帐户控制-频带65536)-eq 65536) { 写入输出$用户。Sam帐户名 } } (3)Windows系统使用C#实现 使用命名空间系统。目录服务,详细代码已上传至github,地址如下: https://github。com/3g student/howork-of-C-Sharp/blob/master/List _ password永不过期_ user _ by LDAP。铯 0x04 向指定用户添加密码永不过期属性的方法 有以下两种实现方法: 1 .用户帐户控制属性值同65536作按位或运算(运算符|) 2 .用户帐户控制属性值直接加上65536 为了能够重复使用,以下方法均使用同65536作按位或运算的方法实现 1.从域内实现 (1)使用dsmod命令 命令实例: dsmod用户CN=testc,CN=Users,DC=test,DC=com' -pwdneverexpires是 (2)使用Powershell ActiveDirectory模块 命令实例: set-ADUser-Identity testc-password永不过期$ true (3)使用PowerView 命令实例: set-ad object-Sam帐户名testc-属性名用户帐户控制-PropertyXorValue 65536 (4)C#实现 使用命名空间系统。目录服务,详细代码已上传至github,地址如下: https://github。com/3g student/howork-of-C-Sharp/blob/master/Add _ password永不过期_ user _ by LDAP。铯 2.从域外实现 (1)使用Powershell ActiveDirectory模块 命令实例: 导入模块。\微软ActiveDirectory。Management.dll $uname='管理员' $ pwd=转换为安全字符串“域密码123!”-AsPlainTextForce $ cred=新对象系统管理。自动化。PS证书(uname,$pwd) 设置用户服务器192。168 .1 .1-Credential $ cred-Identity testc-password永不过期$ true (2)使用PowerView 命令实例: $uname='管理员' $ pwd=转换为安全字符串“域密码123!”-AsPlainTextForce $ cred=新对象系统管理。自动化。PS证书(uname,$pwd) $ Users=Get-net user-Domain ' test . com '-Domain controller 192 . 168 . 1 . 1-Credential $ cred set-ad object-Domain ' test . com '-Domain controller 192 . 168 . 1 . 1-Credential $ cred-Sam account name testc-property name user account control-PropertyXorValue 65536 (3)C#实现 使用命名空间系统。目录服务,详细代码已经上传到github,地址如下: https://github . com/3g student/Homework-of-C-Sharp/blob/master/Add _ password never expires _ user _ by LDAP . cs 测试下图 0x05 向指定用户删除密码永不过期属性的方法 有两种方法可以实现这一点: 1.1.userAccountControl的属性值是与65536(运算符)的按位异或运算 2.userAccountControl属性值直接减去65536 具体方法和0x04类似,不再赘述。 0x06 小结 介绍了域用户具有密码永不过期的特性,分析了枚举、添加和删除属性的原理,介绍了不同情况下的各种实现方法,以及开源的c#实现代码。 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子