域渗透——DNS 记录与 MachineAccount
0x00 前言
在之前的文章 《域渗透——DNS 记录的获取》 和 《域渗透——普通用户权限获得 DNS 记录》 介绍了在域环境下获得 DNS 记录的方法,有助于我们快速了解域内的网络架构。
但是,DNS 记录只能作为辅助判断,DNS 记录、DNS 记录中对应的 MachineAccount(机器帐户) 和实际的计算机三者之间不存在对应关系
域内的非特权用户能够自由创建 DNS 记录和 MachineAccount
本文将要介绍域内非特权用户创建 DNS 记录与 MachineAccount 的方法,记录需要掌握的知识点
0x01 简介
本文将要介绍以下内容:
- MachineAccount 简介
- 非特权用户创建 MachineAccount 的方法
- 非特权用户创建 DNS 记录的方法
0x02 MachineAccount 简介
1.MachineAccount
每当一个计算机加入域中,都会创建一个机器帐户(MachineAccount),作为"Domain Computers"组的成员
在域环境中可以通过以下命令获得所有机器帐户的列表:
net group "Domain Computers" /domain
每一个机器帐户名以字符 $
结尾
注:
使用 Mimikatz 的 DCSync 功能导出所有用户 hash 时,也会导出所有机器帐户的 hash
如果获得了机器帐户的 hash,可以用来制作白银票据(Silver Ticket),接着获得对应服务的访问权限,利用方法可参考之前的文章《域渗透——Pass The Ticket》
2.MachineAccountQuota
用来表示允许用户在域中创建的计算机帐户数,默认为 10
说明文档:https://docs.microsoft.com/en-us/windows/win32/adschema/a-ms-ds-machineaccountquota
关于 MachineAccountQuota(MAQ) 的介绍可参考资料:https://blog.netspi.com/machineaccountquota-is-useful-sometimes/
这里仅对参考资料中提到的 10 个规则做简要总结并添加个人理解,特点如下:
(1) 允许非特权用户通过 MAQ 创建计算机帐户,默认为 10 个,但无法删除创建的计算机账户
(2) 创建者帐户的 SID 存储在计算机帐户的 ms-DS-CreatorSID 属性中
也就是说,对于通过 MAQ 创建的计算机帐户,查看 ms-DS-CreatorSID 属性能够找到创建者帐户的 SID
(3) 通过 MAQ 创建的计算机帐户将放入"Domain Computers"组中
(4) 通过 MAQ 创建的计算机帐户,可修改以下属性:
- AccountDisabled
- description
- displayName
- DnsHostName
- ServicePrincipalName
- userParameters
- userAccountControl
- msDS-AdditionalDnsHostName
- msDS-AllowedToActOnBehalfOfOtherIdentity
- samAccountName
其中 AccountDisabled 属性可以用来禁用该用户
userAccountControl 属性记录了用户的属性信息,具体可参考 https://support.microsoft.com/en-us/help/305144/how-to-use-useraccountcontrol-to-manipulate-user-account-properties
(5) 添加计算机帐户将创建以下 4 个 SPN:
- HOST/MachineAccountName
- HOST/MachineAccountName.domain.name
- RestrictedKrbHost/MachineAccountName
- RestrictedKrbhost/MachineAccountName.domain.name
(6) 机器帐户没有本地登录权限
但可以通过"runas /netonly"执行命令
0x03 非特权用户创建 MachineAccount 的方法
1.Powershell 实现
需要使用 Powermad
通过 MAQ 创建计算机帐户 testNew 的命令如下:
New-MachineAccount -MachineAccount testNew -Password $(ConvertTo-SecureString "123456789" -AsPlainText -Force)
查看计算机帐户 testNew 的完整属性:
Get-ADComputer testNew -Properties *
具体包括以下属性:
- AccountExpirationDate
- accountExpires
- AccountLockoutTime
- AccountNotDelegated
- AllowReversiblePasswordEncryption
- AuthenticationPolicy
- AuthenticationPolicySilo
- BadLogonCount
- badPasswordTime
- badPwdCount
- CannotChangePassword
- CanonicalName
- Certificates
- CN
- codePage
- CompoundIdentitySupported
- countryCode
- Created
- createTimeStamp
- Deleted
- Description
- DisplayName
- DistinguishedName
- DNSHostName
- DoesNotRequirePreAuth
- dSCorePropagationData
- Enabled
- HomedirRequired
- HomePage
- instanceType
- IPv4Address
- IPv6Address
- isCriticalSystemObject
- isDeleted
- KerberosEncryptionType
- LastBadPasswordAttempt
- LastKnownParent
- lastLogoff
- lastLogon
- LastLogonDate
- localPolicyFlags
- Location
- LockedOut
- logonCount
- ManagedBy
- MemberOf
- MNSLogonAccount
- Modified
- modifyTimeStamp
- mS-DS-CreatorSID
- msDS-User-Account-Control-Computed
- Name
- nTSecurityDescriptor
- ObjectCategory
- ObjectClass
- ObjectGUID
- objectSid
- OperatingSystem
- OperatingSystemHotfix
- OperatingSystemServicePack
- OperatingSystemVersion
- PasswordExpired
- PasswordLastSet
- PasswordNeverExpires
- PasswordNotRequired
- PrimaryGroup
- primaryGroupID
- PrincipalsAllowedToDelegateToAccount
- ProtectedFromAccidentalDeletion
- pwdLastSet
- SamAccountName
- sAMAccountType
- sDRightsEffective
- ServiceAccount
- servicePrincipalName
- ServicePrincipalNames
- SID
- SIDHistory
- TrustedForDelegation
- TrustedToAuthForDelegation
- UseDESKeyOnly
- userAccountControl
- userCertificate
- UserPrincipalName
- uSNChanged
- uSNCreated
- whenChanged
- whenCreated
注:
Get-ADComputer 命令需要用到 ActiveDirectory 模块,域控制器一般会安装
对于未安装 Active Directory 模块的系统,可以通过如下命令导入 Active Directory 模块:
import-module .\Microsoft.ActiveDirectory.Management.dll
Microsoft.ActiveDirectory.Management.dll 在安装 powershell 模块 Active Directory 后生成,我已经提取出来并上传至 github:
https://github.com/3gstudent/test/blob/master/Microsoft.ActiveDirectory.Management.dll
Powermad 也支持查看计算机帐户的属性,但需要指定具体要查看的属性
例如查看 servicePrincipalName 属性的命令如下:
Get-MachineAccountAttribute -MachineAccount testNew -Attribute servicePrincipalName
注:
Powermad 的 Get-MachineAccountCreator 命令能够枚举所有计算机帐户(MachineAccount) 的创建者
修改计算机帐户的属性可使用 Powermad 的 Set-MachineAccountAttribute 命令,支持修改的属性如下:
- AccountDisabled
- description
- displayName
- DnsHostName
- ServicePrincipalName
- userParameters
- userAccountControl
- msDS-AdditionalDnsHostName
- msDS-AllowedToActOnBehalfOfOtherIdentity
- SamAccountName
实例如下:
Set-MachineAccountAttribute -MachineName testNew -Attribute SamAccountName -Value test
2.C#实现
SharpAllowedToAct 包含了这个功能
我将其中创建 MachineAccount 的功能提取出来,简单修改后使其支持 csc.exe 或 Visual Studio 编译
完整代码已上传至 github,地址如下:https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/AddMachineAccountofDomain.cs
可以使用 Visual Studio 创建 C#工程编译 AddMachineAccountofDomain.cs 生成 exe 文件,也可以将 AddMachineAccountofDomain.cs 上传至测试环境,使用 csc.exe 进行编译
使用 csc.exe 进行编译的环境支持.Net3.5 或更高版本
编译命令如下:
C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe AddMachineAccountofDomain.cs /r:System.DirectoryServices.dll,System.DirectoryServices.Protocols.dll
or
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe AddMachineAccountofDomain.cs /r:System.DirectoryServices.dll,System.DirectoryServices.Protocols.dll
0x04 非特权用户创建 DNS 记录的方法
这里可以使用 Powermad 中的 Invoke-DNSUpdate.ps1
Invoke-DNSUpdate 命令支持添加以下记录:
- A
- AAAA
- CNAME
- MX
- PTR
- SRV
- TXT
添加机器帐户 testNew 的 A 记录,命令如下:
Invoke-DNSUpdate -DNSType A -DNSName testNew -DNSData 192.168.1.111
删除此记录的命令如下:
Invoke-DNSUpdate -DNSType A -DNSName testNew
非特权用户无法修改或删除已有的记录
更多细节可参考资料:https://blog.netspi.com/exploiting-adidns/
0x05 小结
本文介绍了域内非特权用户创建 DNS 记录与 MachineAccount 的方法,证明了 DNS 记录只能作为辅助判断域内网络架构的方法
站在防御的角度,如果攻击者只有域内非特权用户的权限,在尝试通过 MAQ 创建计算机帐户时,如果没有获得更高权限,就无法清除攻击痕迹(无法删除通过 MAQ 创建的计算机帐户),可通过查看计算机帐户的创建者找到攻击者控制的用户。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: Mimilib 利用分析
下一篇: Jvm 常量池
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论