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创建的计算机帐户),可通过查看计算机帐户的创建者找到攻击者控制的用户。
本文为 3gstudent 原创稿件,授权嘶吼独家发布,如若转载,请注明原文地址